Java Android-如何异步更新ArrayAdapter?

Java Android-如何异步更新ArrayAdapter?,java,android,android-arrayadapter,Java,Android,Android Arrayadapter,我正在使用AsyncTask类从ArrayAdapter中添加、删除和清除项目。不幸的是,当这些任务中的任何一个运行时,ArrayAdapter想要notifyDataSetChanged(),这要求线程在uiThread上运行 如果我使用runOnUiThread(newrunnable(){…})为了异步更新ArrayAdapter,这是否违背了一开始尝试在新线程中更新ArrayAdapter的目的 这里最好的方法是什么?执行.notifyDataSetChanged()insdeonPos

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

如果我使用
runOnUiThread(newrunnable(){…})
为了异步更新ArrayAdapter,这是否违背了一开始尝试在新线程中更新ArrayAdapter的目的


这里最好的方法是什么?

执行
.notifyDataSetChanged()
insde
onPostExecute()
方法
onPostExecute()
方法在Ui线程上运行。如果您的应用程序在执行
doInBackground()
方法期间需要定期更新,则使用
publishProgress()
(它将调用
onProgressUpdate()
方法)并在
onProgressUpdate()内调用
notifyDataSetChanged()
,它也在Ui线程上运行。

Do
.notifyDataSetChanged()
insde
onPostExecute()
方法
onPostExecute()
方法在Ui线程上运行。如果您的应用程序在执行
doInBackground()
方法期间需要定期更新,则使用
publishProgress()
(它将调用
onProgressUpdate()
方法)并在
onProgressUpdate()内调用
notifyDataSetChanged()
,它也在Ui线程上运行。

要回答您的第一个问题,只要在Ui线程上调用的唯一内容是
notifyDataSetChanged()
,调用runOnUiThread就不会违背目的。在AsycnaDapter中执行所有实际的、潜在的长时间运行任务,然后当您准备好告诉活动情况发生了变化时,调用
runOnUiThread()
。它将只运行您在传递给它的Runnable中指定的命令


也就是说,为什么不使用AsyncTask,而尝试使用AsyncTask。AsycntaskLoader几乎是专门为异步填充列表而设计的。它们直到API级别10才被引入,但您仍然可以使用android从较旧的API级别访问它们。

为了回答您的第一个问题,只要您在UI线程上调用的唯一内容是
notifyDataSetChanged()
,调用runOnUiThread就不会违背目的。在AsycnaDapter中执行所有实际的、潜在的长时间运行任务,然后当您准备好告诉活动情况发生了变化时,调用
runOnUiThread()
。它将只运行您在传递给它的Runnable中指定的命令


也就是说,为什么不使用AsyncTask,而尝试使用AsyncTask。AsycntaskLoader几乎是专门为异步填充列表而设计的。它们直到API级别10才被引入,但您仍然可以使用android从较旧的API级别访问它们。

为了补充其他人已经说过的内容,在您的任务运行完成后,您可能需要再次为正在使用的视图设置适配器(或新的适配器)

AFAIK根据您的代码,在NOTIFYDATASETCHANGE或刷新光标后,如果您没有使用引用,视图可能不会立即更新


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

为了补充其他人已经说过的内容,在您的任务运行完毕后,您可能需要为正在使用的视图再次设置适配器(或新的适配器)

AFAIK根据您的代码,在NOTIFYDATASETCHANGE或刷新光标后,如果您没有使用引用,视图可能不会立即更新

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