android中listview中adapter的小问题? 400 报错
定义了一个adapter,里面的数据用list存放,我在主线程中开了一个异步任务去加载数据库中的数据到list中,然后通过主线程的handler发消息过去通知adapter.notifydatachanged();
但不知道为什么有时候会出错?这样做有问题吗?
理论上没错,你的报错信息是什么?
######回复 @流年逝水 : 我遇到过这种错误的。一定要确保正在更新的时候(也就是调用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传递消息太慢了版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。