Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android onCreateView()是否等待AsyncTask执行?_Android_Android Asynctask - Fatal编程技术网

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。