我正在使用AsyncTask
课程来添加,删除和清除ArrayAdapter
项目。不幸的是,当运行任何这些任务时,ArrayAdapter
想要notifyDataSetChanged()
,这要求线程在uiThread
上运行。
如果我使用runOnUiThread(new Runnable(){...});
来异步更新ArrayAdapter,那么这是否会破坏尝试在新线程中更新它的目的?
这里最好的方法是什么?
答案 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级别访问它们。