2010-10-23 3 views
1

У меня есть TabActivity, реализующая TabContentFactory, которая запускает AsyncTask в onCreate() для извлечения данных для вкладок. Когда AsyncTask завершена, onPostExecute() может напрямую обновлять элементы интерфейса, не так ли? Смысл, поскольку этот метод работает в UI-Thread, при доступе к пользовательским интерфейсам не требуется дополнительная синхронизация потоков?Android: TabActivity - не добавлять вкладки до завершения AsyncTask

В любом случае проблема заключается в том, что мой UI-Thread вызывает createTabContent() в TabActivity, в то время как 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. 

Если вам необходимо обновить пользовательский интерфейс, а AsyncTask все еще работает в фоновом режиме, а затем переопределить AsyncTask.onProgressUpdate (..), а затем вызвать AsyncTask.publishProgress (..) из внутри AsyncTask.doInBackground (..) ,

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. Вы можете обновить любые виды деятельности из UI нить в AsyncTask.onPostExecute (..)
  3. Если вам необходимо обновить пользовательский интерфейс, а AsyncTask все еще работает в фоновом режиме, а затем вызвать AsyncTask.publishProgress (..) внутри AsyncTask. doInBackground (..)
+0

привет, спасибо за ответ! Вы сказали, что я должен запустить AsyncTask только после того, как TabActivity будет полностью создан - это точно моя проблема. Я не хочу показывать какую-либо вкладку перед завершением работы AsyncTask. : -/ – cody

+0

Я забыл объяснить: все работает отлично, я хочу, чтобы UI-Thread ожидал данных. Я рассмотрел инициализацию TabActivity с моими 5 вкладками, содержащими один пустой ScrollView, а затем добавлением содержимого к ним в AsyncTask.onPostExecute (..). Но я не уверен, что это сработает ...? – cody

+0

Он должен работать. Вы можете добавлять/изменять контент в любое время после инициализации виджета. Для удобства пользователей вы должны показать ProgressBar и заменить его содержимым после его загрузки. Вы можете обновлять постепенно (вкладка за вкладкой) по мере доступности контента. См. Пункт 3. выше. –