2010-10-23 49 views
1

我有一個TabActivity實現TabContentFactory,它啓動onCreate()中的AsyncTask來獲取標籤的數據。當AsyncTask完成後,onPostExecute()可以直接更新UI元素,對吧?這意味着,由於該方法在UI-Thread中運行,訪問UI元素時不需要進一步的線程同步嗎?Android:TabActivity - 在AsyncTask完成之前不添加標籤

無論如何,我的問題是我的UI-Thread在TabActivity中調用createTabContent(),而AsyncTask仍然很忙。我必須添加至少一個選項卡,否則我得到一個NullPointerException。但是,當我的AsyncTask完成並且ProgressDialog已被解散時,如何添加選項卡?

我會很高興,如果有人可以幫助...

回答

1
When the AsyncTask has finished, onPostExecute() could directly update the 
UI-elements, right? Meaning, since that method runs in the UI-Thread no further 
thread-synchronization would be required when accessing UI-elements? 

權。

Anyway, the problem I have is that my UI-Thread calls createTabContent() in the 
TabActivity while the AsyncTask is still busy. 

如果您需要更新UI時的AsyncTask仍在後臺運行,然後覆蓋AsyncTask.onProgressUpdate(..),然後調用來自AsyncTask.doInBackground內AsyncTask.publishProgress(..)(..) 。

I have to add at least one tab, or I get a NullPointerException. But how do I 
only add tabs when my AsyncTask has finished and the ProgressDialog has been 
dismissed? 

我不明白這一點。你能否詳細解釋一下?

總之,看這件事情​​:

  1. 開始的AsyncTask之後才完全創建TabActivity。從onPostCreate()開始,而不是onCreate()。這可能是你的NullPointerException的一個來源。
  2. 可以內AsyncTask.onPostExecute(..)
  3. 更新從UI線程的任何活動。如果您需要更新UI時的AsyncTask仍在後臺運行,然後從內部的AsyncTask調用AsyncTask.publishProgress(..)。 doInBackground(..)
+0

嗨,謝謝你的回答!你說我應該在完全創建TabActivity之後才啓動AsyncTask - 這正是我的問題。我不想在AsyncTask完成之前顯示任何選項卡。 : -/ – cody 2010-10-23 18:39:29

+0

我忘記解釋了:一切正常,我只想讓UI線程等待數據。我考慮用包含一個空ScrollView的5個選項卡初始化TabActivity,然後在AsyncTask.onPostExecute(..)中向這些選項添加內容。但我不確定這是否會奏效......? – cody 2010-10-23 18:47:57

+0

它應該工作。小部件初始化後,您可以隨時添加/更改內容。爲了方便用戶,您應該顯示ProgressBar並在加載後將其替換爲內容。隨着內容可用,您可以逐步更新(選項卡之後的選項卡)。見上面第3點。 – 2010-10-23 19:01:58