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的主要内容,如果未能解决你的问题,请参考以下文章

Android:使用“进度”GUI在后台线程中从网络加载数据? [复制]

Android异步加载网络图片

浅谈android中的异步加载一

Android异步任务AsyncTask

Android——消息分发机制

从ArrayAdapter每毫秒更新Android ListView中的一行