我正在使用Async任务解析包含一些名称的xml文件,并通过主线程再次将这些名称填充到列表视图中。但在我的情况下发生的是,当Async任务仍在运行时,主线程已经将名称填充到listview,这导致listview上没有项目。我应该让主线程等到Async任务完成工作还是有其他方法来解决这个问题。如果是,当我不知道异步任务可能需要多长时间才能使主线程等待。?
答案 0 :(得分:6)
如果要完成AsycTask,则可以使用AsyncTask中的.get()
方法。 (将阻止MainUiThread )
但我认为最好的方法是不阻止 MainUiThread 你必须在onPreExecute()
和填充ListView 之后启动 ProgressDialog onPostExecute()
的AsyncTask完成onPostExecute()
中的 ProgressDialog 。
答案 1 :(得分:5)
如果您使用过AsyncTask,那么在doInBackground()中执行xml fetch并更新onPostExecute()中listview的所有UI元素,它在主UI线程上运行,并在doInBackground()之后自动运行。这样你就不必明确地让UI线程等待
答案 2 :(得分:3)
您不希望阻止主线程并等待异步任务(这会破坏异步任务的目的)。相反,异步任务应在onPostExecute
方法完成时触发更新。
您可能还想查看最新的Loader
设计。
答案 3 :(得分:3)
- 首先 Android 中的Main
个帖子是Dedicated UI thread
。
- 您需要做的是通过使用名称解析xml来填充List,然后继续在ListView上显示它。
- 您可以使用CoundDownLatch
包中的java.util.concurrent
将数据填入列表,然后再在ListView
上显示。
- 使用await()
的{{1}}和countDown()
等方法执行此操作。
答案 4 :(得分:2)
使用AsyncTask.get()等待AsyncTask完成。
注意:这将停止执行Main Thead,直到从AsyncTask检索到结果
答案 5 :(得分:0)
String str_result= new RunInBackGround().execute().get();
Log.e("","show this");
RunInBackGround是您的AsyncTasc类名。 首先将运行异步任务,完成后将显示以下消息!