android报The content of the adapter has changed but ListView did not receive a notification的解决方案

在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()方法,切记!!!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值