在android开发中,ListView用的非常多,不管是新手还是多年的开发多年的老鸟,可能都会遇到这个异常:


java.lang.IllegalStateException: 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. Make sure your adapter calls notifyDataSetChanged() when its content changes.


这个异常发生的原因就是你的数据集发生了改变,但是没有调用notifyDataSetChanged()方法,但是很多人非常的疑惑,明明是调用了notifyDataSetChanged()方法,但是还是报了这个异常,我也是开发了两年多的android,还是遇到了这个问题,可能是我的内功还不够不,这个周末也没有休息,专门来解决这个问题,好在皇天不负有心人,终于解决了。
下面我来描述下这个问题出现的场景:
大部分的时候我们是从网络上获取的数据,获取完成后,我们更改本地的数据源,然后调用notifyDataSetChanged()方法,这个流程没有错吧。
我们获取数据肯定不会在UI线程里面直接获取,一般来说,我们会新开一个线程,或者是用AsyncTask,还有就是一些第三方的框架,比如okhttp,我用的就是okhttp,不管使用哪种方法,新开一个线程是在run()方法里面,AsyncTask是在doInBackground()方法里面,okhttp是在onResponse()方法里面,我们获取的数据都是在子线程里面获取的,获取数据以后我们就直接更改了与Adapter绑定的数据集,这个数据集是在这个子线程里面更改的,但是我们不能再子线程里面调用notifyDataSetChanged()方法,我们必须在UI线程里面调用notifyDataSetChanged()方法,那么我们就要使用Handler或者runOnUiThread()方法来处理,这个时候问题来了,我们在子线程里面更改了数据集,但是在UI线程里面调用notifyDataSetChanged()方法,这是问题发生的原因之所在,这个异常不一定会时时出现,但是会偶尔出现,一旦出现不会提示报错在哪一行,全是内部的异常,而且如果你用了第三方的异常上报,也不会上报,非常麻烦,极难排查。
解决的方案就是更改数据集和调用notifyDataSetChanged()方法一定要在UI线程,不能分开,而且要按顺序,先更改数据集,马上调用notifyDataSetChanged()方法,切记!!!

更多相关文章

  1. “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
  2. Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
  3. 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
  4. Android实现内存中数据保存到sdcard的方法
  5. OpenCV4Android(安卓)不需要安装OpenCVManager,就可以运行的方法
  6. android开发游记:从viewpager禁用滚动 总结android事件分发机制
  7. Android截图的两种方法
  8. android之退出应用程序
  9. 记录Android中使用ViewDragHelper实现拖动View滑动的方法

随机推荐

  1. Android事件处理分析+Android事件处理 +A
  2. Android(AIDL)自动重复拨号及挂断/接听电
  3. Android(安卓)Logcat的使用
  4. Android开发中修改程序字体
  5. android 对话框方式弹出实现
  6. Android Intents
  7. 2012-7-17 固定屏幕显示模式Android: Scr
  8. android: layout_gravity VS android: gr
  9. Android Studio设置HTTP代理
  10. Linux系统添加Android SDK环境变量以及设