1

私はとを持っていObservableますObserver。オブザーバブルはバックグラウンドスレッドにいくつかのものをダウンロードしnotifyObservers、オブザーバーにステータスを読み取らせるように呼び出します。

オブザーバーのある時点でpublic void update、GUIを更新しようとします

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

しかし、Observable(!!!)がこれをスローするため、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)

これを防ぐ方法はありますか?私はここで明白な何かを見逃していると確信しています。

4

1 に答える 1

5

私はあなたの問題がこれに似ていると思います:Android:android.view.ViewRoot $ CalledFromWrongThreadException-問題を解決する方法は?

bhatt4982がそこで答えるので、ハンドラーを使用できます。そのドキュメントから:

「ハンドラーの主な用途は2つあります。(1)メッセージとランナブルを将来のある時点で実行するようにスケジュールすることと、(2)自分のスレッドとは異なるスレッドで実行されるアクションをキューに入れることです。」

AshtonBRSCからの回答も良いです。UIの更新をRunnableで囲み、runOnUiThreadアクティビティのメソッドを使用できます。

于 2010-04-08T10:19:22.427 に答える