2013-02-21 104 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()