ListView和Adapter Crash问题的分析和解决

发现情况

正在做一个设备控制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。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值