Android - 如何异步更新ArrayAdapter?

时间:2011-10-24 21:55:34

标签: java android android-arrayadapter

我正在使用AsyncTask课程来添加,删除和清除ArrayAdapter项目。不幸的是,当运行任何这些任务时,ArrayAdapter想要notifyDataSetChanged(),这要求线程在uiThread上运行。

如果我使用runOnUiThread(new Runnable(){...});来异步更新ArrayAdapter,那么这是否会破坏尝试在新线程中更新它的目的?

这里最好的方法是什么?

3 个答案:

答案 0 :(得分:4)

执行.notifyDataSetChanged() insde onPostExecute()方法。 onPostExecute()方法在Ui-Thread上运行。如果您的应用需要在执行doInBackground()方法期间定期更新,请使用publishProgress()(将调用onProgressUpdate()方法)并在notifyDataSetChanged()方法中调用onProgressUpdate()也可以在Ui-thread上运行。

答案 1 :(得分:1)

只需在其他人已经说过的内容中添加一些内容,在任务完成后,您可能希望再次为您正在使用的视图设置适配器(或新的适配器)。

AFAIK取决于您的代码,在notifyDataSetChanged之后或刷新光标后,如果您不使用引用,视图可能不会立即更新。

如果您离开活动,当您回来时,视图会更新,您可能需要再次设置适配器。

答案 2 :(得分:0)

要回答您的第一个问题,只要您在UI线程上调用的唯一内容是notifyDataSetChanged(),调用runOnUiThread就不会失败。在AsycnAdpater中完成所有实际的,潜在的长期任务,然后当您准备好告诉事件发生了变化时,请致电runOnUiThread()。它只会运行您传递给它的Runnable中指定的命令。

那就是说,为什么不使用AsyncTask而不是使用AsyncTaskLoader。 AsycnTaskLoaders几乎专门用于异步填充列表。它们直到API级别10才会被引入,但您仍然可以使用android Support Package从较旧的API级别访问它们。