2010-04-08 2 views
1

У меня есть Observable и Observer. Наблюдаемый загружает некоторые вещи в фоновый поток и вызывает notifyObservers, чтобы наблюдатели могли прочитать статус.Как обрабатывать вывод данных в Наблюдателе?

В какой-то момент в public void update наблюдатель пытается обновит графического интерфейса пользователя

((TextView)findViewById('R.id.foo')).setText("bar"); 

но похоже, наблюдаемый поток вызывает этот метод, потому что Наблюдаемые (!!!) выдает это:

android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
at android.view.ViewRoot.checkThread(ViewRoot.java:2462) 
at android.view.ViewRoot.requestLayout(ViewRoot.java:512) 
... 
at com.mynamespace.acitivty.TrackActivity.startPlay(TrackActivity.java:72) 
at com.mynamespace.acitivty.TrackActivity.update(TrackActivity.java:107) 
at java.util.Observable.notifyObservers(Observable.java:147) 
at java.util.Observable.notifyObservers(Observable.java:128) 
at com.mynamespace.module.communication.Download.stateChanged(Download.java:213) 
at com.mynamespace.module.communication.Download.run(Download.java:186) 
at java.lang.Thread.run(Thread.java:1058) 

Есть ли способ предотвратить это? Я уверен, что я пропустил что-то очевидное здесь.

ответ

5

Я думаю, что ваш вопрос похож на этот: Android:android.view.ViewRoot$CalledFromWrongThreadException - How to solve the problem?

Как bhatt4982 ответы там, вы можете использовать Handler. Из его документа:

«Для обработчика используются два основных вида использования: (1) планировать сообщения и исполняемые файлы, которые должны выполняться как некоторые точки в будущем, и (2) устанавливать в очередь действие, которое должно выполняться на другом чем ваш собственный ».

Ответ от AshtonBRSC также хорош, вы можете приложить обновление своего пользовательского интерфейса в Runnable и использовать способ деятельности runOnUiThread.

Смежные вопросы