Android:线程从网络加载数据后更新Listview

时间:2009-03-16 19:03:12

标签: android listview

  1. 我喜欢用户启动应用程序时立即显示我的GUI。
  2. 然后在后台加载一些数据(文字,图片)(如YouTube应用)。
  3. ListView和图库会自动使用此新数据进行更新。
  4. 我启动ListView,启动一个Thread并加载数据......然后ListView不会更新! 有几个人告诉我应该使用notifyDataSetChanged()。 但是我不能把这个命令放在我的线程中(只是未知)。

    有什么想法吗?

3 个答案:

答案 0 :(得分:19)

我有同样的问题......当我遇到这个问题时,我很兴奋。但没有答案? : - (

之后,让问题持续了大约两周,我找到了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()方法中的视图。

我希望这可以帮助其他人。

答案 1 :(得分:4)

您可以使用slowAdapter刷新视图:

SlowAdapter = new SlowAdapter(this);

list.setAdapter(SlowAdapter);
SlowAdapter.notifyDataSetChanged();

答案 2 :(得分:3)

在阅读这个帖子并尝试时,我自己就找到了它。

简短: AsyncTask 的方法 onProgressUpdate 可以触摸视图http://developer.android.com/reference/android/os/AsyncTask.html#onProgressUpdate(Progress...)

背景:我需要在游标上调用requery,以便在任务填充数据库时不断更新ListView。在 doInBackground 中进行的重新查询调用因提及的 CalledFromWrongThreadException 失败,但 onProgressUpdate 中的相同代码无效。