listview频繁刷新报错

在Android编程中使用Adapter时,偶尔会出现以下错误:
The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread。
 
DDMS中的log也没法定位到准确的出错位置。检查错误能够从下面几点入手:
一、检查Thread,肯定没有在Background thread中直接调用adapter,若是有,请移除相关代码到Handler中处理;
二、尽可能将数据放在adapter类中管理,不须要的时候清除信息(勤写clear()),及时用notifyDataSetChanged()刷新;
三、在Activity或者Fragment合适的位置(onPause/onStop)要及时检查thread,有adapter数据处理相关的应立刻中止;
四、这个错误常常出如今Activity休眠起来以后,主要仍是使用adapter不过小心形成的。若是实在找不到缘由,在onPause()函数中中止全部的background thread,而且在onResume()函数最前面清空adapter中的数据,而且adapter.notifyDataSetChanged()。而后从新更新加载数据,这样通常能够解决问题。
 

Android开发过程当中,使用了大量的ListView,发现这个错误偶尔会出现。特别是作压力测试的时候,不停的点击刷新,更容易出现这个错误。代码中已经使用了AdapternotifyDataSetChanged()方法通知UI更新了,可是仍是会出现这个错误。究其根本缘由,仍是线程之间同步的问题。好比,线程1更新了Adapter中的内容,却尚未来得及通知内容已经更新,就又有线程2更新了Adapter中的内容,这个时候若是线程1再通知内容更新,就会出现上述异常了。编程

 

在此提出一些解决办法:函数

对线程进行管理,若是当前Actitivty暂停了,及时中止这些线程。测试

数据更新后,要及时使用notifyDataSetChanged()方法通知UI,避免出现数据不一致的状况。spa

数据的更新,最好放在主线程中进行。这样可使用同步数据更新与通知内容更新部分的代码。线程

总结:开发

若是listview有数据更新,其己经改变了adapter的getCount()方法。此时必需要通知adapter更新数据,不然就会报adapter数据不匹配的错误。当adapter发生变化,即刻调用notifyDataSetChanged方法,避免出现数据不一致的状况。get

相关文章
相关标签/搜索