Android onCreateView()是否等待AsyncTask执行?
以下是我的情况: 在我的Android onCreateView()是否等待AsyncTask执行?,android,android-asynctask,Android,Android Asynctask,以下是我的情况: 在我的onCreate()中,我想创建一个AsyncTask来检索服务器的数据并将其存储在ArrayList中 然后,在我的onCreateView()中,我想将该数据放入列表视图中,设置onItemClickListener,等等 问题是我正在AsyncTask和UI线程之间创建一个竞争。如果在AsyncTask完成检索之前调用了onCreateView(),那么我没有正确设置适配器,也没有设置onItemClickListener,等等 在启动onCreateView()函
onCreate()
中,我想创建一个AsyncTask
来检索服务器的数据并将其存储在ArrayList
中
然后,在我的onCreateView()
中,我想将该数据放入列表视图中,设置onItemClickListener
,等等
问题是我正在AsyncTask
和UI线程之间创建一个竞争。如果在AsyncTask
完成检索之前调用了onCreateView()
,那么我没有正确设置适配器,也没有设置onItemClickListener
,等等
在启动onCreateView()
函数之前,我想用某种方法确保等待AsyncTask
完成执行。这可能吗?我读过关于在任务中使用get()
的内容,但在执行时遇到了一些问题。它似乎什么也没做
我想在onCreate()
中检索数据,并在onCreateView()
中设置适配器(而不是在AsyncTask
的onPostExecute()
中设置适配器),原因是我想检索一次数据,如果用户旋转屏幕或导航回该片段
无论您在onCreateView()
中做什么,都可以创建视图,将其移动到onViewCreated()
onViewCreated
是在视图准备就绪后调用的,这样您就不会有问题了,那么这里有一个更好的方法。初始化列表视图
并在onCreate()中启动异步任务
。一旦服务器提供了数据,就可以将其添加到提供给适配器的同一数组中,并调用适配器的notifyDatasetChanged()
,以填充列表视图。在这里,您还可以使用ListFragment
,在其中可以调用setEmptyText()
来添加列表为空时显示的文本。您应该遵循@sujith的答案并更改实现,但以下是对您的特定问题的回答:
我想要一些方法来确保我等待AsyncTask完成
在启动onCreateView()函数之前完成执行。这是吗
可能吗
是的,这是可能的,但它会阻止用户界面在等待任务完成时显示
创建并执行AsyncTask
,然后保留对它的引用:
MyAsyncTask mTask;
...
...onCreate()
mTask = new MyAsyncTask();
mTask.execute();
...
...onCreateView()
myInfo = mTask.get();
super.onCreateView().
在您的情况下,这是一个坏主意,然而,有时您可能需要这样做
编辑:mTask.get()
将返回由doInBackground()返回的任何内容。是否每次更新适配器时都必须设置OnItemClickListener()?还是一开始只有一次?另外,如果尚未创建视图,如何在onCreate()中初始化listview?这不会给我一个nullpointerexception吗?您只需设置一次OnItemClickListener
。要在没有数据时初始化列表视图,只需使用不带元素的ArrayList
。它不会给出任何NullPointerException。稍后当数据到达时,您可以将其添加到相同的ArrayList
中,并调用notifyDataSetChanged()
。谢谢!很好!关于OnItemClickListener
注释的一个快速问题:如果我只有setOnItemClickListener
调用onCreateView()
,它似乎不起作用。但是,如果在更新适配器后再添加一个对setOnItemClickListener
的调用,它就会工作。这并不是什么大问题,因为它是这样工作的,但如果你有任何想法,我想知道为什么会发生这种情况。谢谢。您没有显示任何代码,但如果让我猜的话,它正在被垃圾收集,因为您不再持有对它的引用。您使用的是ListActivity
还是ListFragment
?因此我必须在onCreate()中膨胀视图吗?我显然需要视图来查找ListView。