开发者社区> 问答> 正文

android中listview中adapter的小问题? 400 报错

android中listview中adapter的小问题? 400 报错

定义了一个adapter,里面的数据用list存放,我在主线程中开了一个异步任务去加载数据库中的数据到list中,然后通过主线程的handler发消息过去通知adapter.notifydatachanged();

但不知道为什么有时候会出错?这样做有问题吗?

展开
收起
爱吃鱼的程序员 2020-05-29 20:06:06 893 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    理论上没错,你的报错信息是什么?

    ######回复 @流年逝水 : 我遇到过这种错误的。一定要确保正在更新的时候(也就是调用getView(...)的时候),数据源不会在其他地方更改。而且这种问题一般不是必现。######回复 @流年逝水 : 我没用过这种,我以前是把异步操作放在handler上,调用notifyDataSetChanged报错了。######回复 @爱逃课的学习君 :在doInBackground里加载到每一个arraylist后,调用publishProgress ,在onProgressUpdate中用handler发一个消息过去通知adapter.notifydatachanged######回复 @流年逝水 : 你异步加载数据时是在哪里操作的,在线程加载完数据然后在把数据放到message,传给handler处理ui?######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.######

    不如把AsyncTask中的progress改成list,在onprogressupdate中改变adapter的list。保证改变adapter的操作和notify的操作都在主线程中

    ######

    最好不要在子线程中去操作处理主线程中用到的数据。这样有可能导致数据的不一致。正确的办法是在子线程中处理好数据,通过Message传递数据给主线程,然后进行赋值操作,再通知更新 adapter.notifydatachanged

    ######回复 @jeremy_sky : 我当时在那一条条打印 真的很慢 不知道什么原因######回复 @jeremy_sky : 正解######回复 @流年逝水 : 在子线程中改变主线程用到的数据时很危险的,因为你不知道主线程在什么时候用到这部分数据(可能View重新绘制会使用得到,AbsListView重新填充也可能会用得到,等)。######回复 @流年逝水 : message传object是一个引用,应该不会导致“数据多”而变慢。如果message消息比较慢,你看看消息队列阻塞没有。######数据挺多的 用message传递消息太慢了
    2020-05-29 20:06:08
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
58同城Android客户端Walle框架演进与实践之路 立即下载
Android组件化实现 立即下载
蚂蚁聚宝Android秒级编译——Freeline 立即下载