以下是我的情况:
在我的onCreate()
中,我想创建一个AsyncTask
来检索服务器的数据并将其存储在ArrayList
中。
然后在我的onCreateView()
中,我想将这些数据放在ListView
中,设置onItemClickListener
等等......
问题是我在AsyncTask
和UI线程之间创建了一场竞赛。如果在onCreateView()
完成检索之前调用了AsyncTask
,那么我没有正确设置适配器,不设置onItemClickListener
等...
我想在启动AsyncTask
函数之前确保等待onCreateView()
完成执行。这可能吗?我读到了关于在任务中使用get()
的问题,但我在执行它时遇到了一些麻烦。它似乎没有做任何事情。
我想在onCreate()
中检索数据并在onCreateView()
中设置适配器(而不是在onPostExecute()
的{{1}}中设置适配器)的原因是我想要检索一次数据,并且只要用户旋转屏幕或导航回AsyncTask
就能创建视图。
答案 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
,这样您就不会遇到问题