1

我有一个Observable和一个Observer。observable 确实在后台线程中下载了一些东西并调用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在那里回答的那样,您可以使用Handler。从它的文档:

“处理程序有两个主要用途:(1) 安排消息和可运行文件在未来某个时间点执行;(2) 将要在与您自己的线程不同的线程上执行的操作排入队列。”。

AshtonBRSC的回答也很好,您可以将 UI 更新包含在 Runnable 中并使用runOnUiThread Activity 的方法。

于 2010-04-08T10:19:22.427 回答