在Android开发过程中,使用了大量的ListView,发现这个错误偶尔会出现。特别是做压力测试的时候,不停的点击刷新,更容易出现这个错误。代码中已经使用了Adapter的notifyDataSetChanged()方法通知UI更新了,但是还是会出现这个错误。究其根本原因,还是线程之间同步的问题。比如,线程1更新了Adapter中的内容,却还没有来得及通知内容已经更新,就又有线程2更新了Adapter中的内容,这个时候如果线程1再通知内容更新,就会出现上述异常了。
在此提出一些解决办法:
对线程进行管理,如果当前Actitivty暂停了,及时停止这些线程。
数据更新后,要及时使用notifyDataSetChanged()方法通知UI,避免出现数据不一致的情况。
数据的更新,最好放在主线程中进行。这样可以使用同步数据更新与通知内容更新部分的代码。
示例代码:
- if(recThread == null){
- recThread = new Thread(){
- @Override
- public void run(){
- }
- };
- }
- if(!recThread.isAlive()){
- recThread.start();
- }
- @Override
- protected void onPause() {
- // TODO Auto-generated method stub
- super.onPause();
- Friends.stopRecThread();
- Log.d("meng", "onPause2");
- }
- public static void stopRecThread(){
- if(recThread!=null){
- recThread.interrupt();
- recThread = null;
- }
- }