Как обрабатывать вывод данных в Observer? - PullRequest
1 голос
/ 08 апреля 2010

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

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

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

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

 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)

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

1 Ответ

5 голосов
/ 08 апреля 2010

Я думаю, что ваша проблема похожа на эту: Android: android.view.ViewRoot $ CalledFromWrongThreadException - Как решить проблему?

Поскольку bhatt4982 отвечает там, вы можете использовать Обработчик . Из своего документа:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...