2013-02-21 105 views
13

这里是我的情况:onCreateView()等待AsyncTask执行?

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

然后在我的onCreateView(),我希望把这些数据用在ListView,设置onItemClickListener等..

的问题是,我创造了AsyncTask和UI线程之间的竞争。如果AsyncTask完成检索前onCreateView()被调用,那么我不正确设置适配器,不设置onItemClickListener,等等

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

我想在onCreate()检索数据和onCreateView()设置适配器(而不是在AsyncTaskonPostExecute()设置适配器)的原因,是我想一旦检索数据,并能够公正如果用户旋转屏幕或导航回Fragment,则创建视图。

回答

10

这里有一个更好的方法被调用。初始化您的ListView并在onCreate()开始AsyncTask。从服务器获得数据后,将其添加到提供给适配器的同一阵列中,并调用适配器的notifyDatasetChanged(),该适配器负责填充列表视图。在这里,您也可以使用ListFragment,如果列表为空,您可以拨打setEmptyText()添加显示的文本。

+0

哦有趣返回。我每次更新适配器时都必须setOnItemClickListener()吗?或者一开始只有一次?另外,如果视图尚未创建,我如何初始化onCreate()中的listview?这不会给我一个nullpointerexception? – user2085335 2013-02-21 01:38:25

+0

您只需设置一次“OnItemClickListenter”。要在没有数据时初始化列表视图,只需使用没有元素的'ArrayList'。它不会给出任何NullPointerException。稍后当数据到达时,您可以将它添加到同一个'ArrayList'并调用'notifyDataSetChanged()'。 – sujith 2013-02-21 02:14:42

+0

谢谢!很棒!关于“OnItemClickListener”注释的一个简单问题:如果我只在'onCreateView()'中调用'setOnItemClickListener',它似乎不起作用。但是如果我在更新适配器后再向'setOnItemClickListener'添加另一个调用,它就会起作用。这并不是什么大问题,因为它是以这种方式工作的,但我想知道为什么如果您有任何想法会发生这种情况。谢谢。 – user2085335 2013-02-21 02:45:44

0

无论你是在做onCreateView(),将其移动到onViewCreated()

onViewCreated后视图准备,所以你不会有问题,那么

1

您应该遵循@ sujith答案,并改变你的实现,但这里是回答您的具体问题:

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

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

创建和执行您的AsyncTask然后扶住参考吧:

MyAsyncTask mTask; 

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

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

编辑:mTask.get()将返回无论是由doInBackground()