onCreateView()等待AsyncTask执行?

时间:2013-02-21 00:53:42

标签: android android-asynctask

以下是我的情况:

在我的onCreate()中,我想创建一个AsyncTask来检索服务器的数据并将其存储在ArrayList中。

然后在我的onCreateView()中,我想将这些数据放在ListView中,设置onItemClickListener等等......

问题是我在AsyncTask和UI线程之间创建了一场竞赛。如果在onCreateView()完成检索之前调用了AsyncTask,那么我没有正确设置适配器,不设置onItemClickListener等...

我想在启动AsyncTask函数之前确保等待onCreateView()完成执行。这可能吗?我读到了关于在任务中使用get()的问题,但我在执行它时遇到了一些麻烦。它似乎没有做任何事情。

我想在onCreate()中检索数据并在onCreateView()中设置适配器(而不是在onPostExecute()的{​​{1}}中设置适配器)的原因是我想要检索一次数据,并且只要用户旋转屏幕或导航回AsyncTask就能创建视图。

3 个答案:

答案 0 :(得分:10)

这是一种更好的方法。初始化ListView并在AsyncTask中开始onCreate()。一旦从服务器获得数据,就可以将其添加到适配器的同一个数组中,并调用适配器的notifyDatasetChanged(),它负责填充列表视图。在这里,您可以使用ListFragment,您可以在其中调用setEmptyText()来添加列表为空时显示的文字。

答案 1 :(得分:1)

您应该关注@ sujith的回答并更改您的实施,但这里是您具体问题的答案:

  

我想要一些方法来确保我等待AsyncTask   在启动onCreateView()函数之前完成执行。这是   可能的?

是的,这是可能的,但它会阻止您的UI在等待任务完成时显示。

创建并执行AsyncTask,然后按住对它的引用:

MyAsyncTask mTask;

...
...onCreate()
mTask = new MyAsyncTask();
mTask.execute();
...
...onCreateView()
myInfo = mTask.get();
super.onCreateView().

在你的情况下,这是一个坏主意,但是,有时你可能需要这样做。

编辑:mTask.get()将返回doInBackground()

返回的内容

答案 2 :(得分:0)

无论您在onCreateView()中做了什么,请将其移至onViewCreated()

在视图准备就绪后调用

onViewCreated,这样您就不会遇到问题