发现情况
正在做一个设备控制app,需要阻塞接受下位机发送的can数据,当数据发送过快,10ms一次的时候,app crash 报错:
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.
原因查找
根据报错信息找到报错位置:
protected void layoutChildren() {
*****************************************
else if (mItemCount != mAdapter.getCount()) {
throw new 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. [in ListView(" + getId() + ", " + getClass()
+ ") with Adapter(" + mAdapter.getClass() + ")]");
}
*****************************************
根据代码发现 mItemCount != mAdapter.getCount()
分析
原因是由于我在子线程中更新数据,在主线程中更新ui。
比如你在handler处理同步主线程中 为mItemCount,而这时候子线程add(data),mAdapter.getCount()就加1。
这时候mItemCount != mAdapter.getCount();
解决
把数据更新的操作也放到主线程中。
这样的话即使1ms发一次数据 app 也不会crash。