Android:线程从网络加载数据后更新Listview
Posted
技术标签:
【中文标题】Android:线程从网络加载数据后更新Listview【英文标题】:Android: Update Listview after Thread loads data from the net 【发布时间】:2010-10-13 16:44:06 【问题描述】:-
我喜欢我的 GUI 在用户启动应用程序时立即出现。
然后在后台加载一些数据(文本、图片)(如 YouTube 应用)。
ListView 和 Gallery 会使用这些新数据自动更新。
我启动我的 ListView,启动一个线程并加载数据......然后 ListView 没有得到更新!
有几个人告诉我应该使用notifyDataSetChanged()
。
但我不能将此命令放在我的线程中(只是未知)。
有什么想法吗?
【问题讨论】:
【参考方案1】:我也有同样的问题......当我遇到这个问题时我很兴奋。但没有答案? :-(
之后,让问题搁置了大约两个星期,我找到了solution here:
长话短说:
引用以上链接:
我们必须使用 Handler 对象,因为 我们无法更新大多数 UI 对象,而 在一个单独的线程中。当我们发送一个 消息给它会得到的处理程序 保存到队列中并被执行 尽快的 UI 线程。
查看代码后,您就会明白作者所说的内容。 注意:即使使用处理程序,android 也可能不允许您从线程的 run() 方法更新视图对象。 我收到了这个错误:
05-31 02:12:17.064: ERROR/AndroidRuntime(881):
android.view.ViewRoot$CalledFromWrongThreadException:
Only the original thread that created a view hierarchy can touch its views.
为了解决这个问题,我在 run() 方法中更新了一个数据数组,并使用该数组更新处理程序的 handleMessage() 方法中的视图。
我希望这可以帮助其他人。
【讨论】:
【参考方案2】:您可以使用 slowAdapter 来刷新视图:
SlowAdapter slowAdapter = new SlowAdapter(this);
list.setAdapter(slowAdapter);
slowAdapter.notifyDataSetChanged();
【讨论】:
【参考方案3】:我自己在阅读这个帖子并尝试时发现了它。
简短:AsyncTask 的方法 onProgressUpdate 可以触摸视图:http://developer.android.com/reference/android/os/AsyncTask.html#onProgressUpdate(Progress...)
背景:我需要在光标上调用 requery,以便在任务填充数据库时不断更新 ListView。在 doInBackground 中进行的重新查询调用因提到的 CalledFromWrongThreadException 而失败,但 onProgressUpdate 中的代码相同。
【讨论】:
以上是关于Android:线程从网络加载数据后更新Listview的主要内容,如果未能解决你的问题,请参考以下文章