listview刷新点击,出现The content of the adapter has changed but ListView did not receive a notification问题

最近在做蓝牙列表刷新选取的功能,其中在做点击压力测试的时候出现了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.的错误。


错误提示中明确指出了因为listview的adapter发生了变化,而listview并没有更新引起的问题。于是我开始逐步的分析查找,因为我代码中在更新数据的时候调用了notifyDataSetChanged方法,且是在UI线程中执行的。没有使用子线程去更新adapter,这一点还是可以确定的(可以debug断点调试)。


但是问题出现了,究其根本原因,还是adapter绑定的数据出了问题。比如,有其他线程更新了adapter的绑定数据,却没有通知内容已经更新,这时候点击listview就会出现上述异常了。


那么问题来了,为什么设置给adapter的数据会发生变化呢?


我的数据传递模式大概是这样的 :

蓝牙服务搜索->存储数据A->message发送A到UI->设置数据B=A->设置adapter的数据为B;


然后在做重新搜索刷新的时候,蓝牙服务将A数据清空了,然而问题就出现在这,将A对象指向地址的数据清空后,B对象的指向地址和A是一样的,导致B的数据也被清空了,adapter绑定的数据发生了变化,最终引起上述问题。


解决方法:

  在蓝牙再次搜索的时候重新建立数据存储对象A,重新赋值A对象的内存指向,再传递给B,或者是将A中的数据copy到B中。

谁说java中没有指针,对象就是指针!


你可能感兴趣的:(listview刷新点击,出现The content of the adapter has changed but ListView did not receive a notification问题)