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()
insdeonPostExecute()
方法onPostExecute()
方法在Ui线程上运行。如果您的应用程序在执行doInBackground()
方法期间需要定期更新,则使用publishProgress()
(它将调用onProgressUpdate()
方法)并在onProgressUpdate()内调用notifyDataSetChanged()
,它也在Ui线程上运行。Do.notifyDataSetChanged()
insdeonPostExecute()
方法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或刷新光标后,如果您没有使用引用,视图可能不会立即更新
如果您离开活动,并且当您回来时,视图已更新,则可能需要再次设置适配器