我有一个 Observable
和一个 Observer
。 observable 会在后台线程中下载一些东西并调用 notifyObservers
让观察者读取状态。
在 public void update
的某个时刻,观察者尝试更新 GUI
((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)
有什么方法可以防止这种情况发生吗?我确定我在这里遗漏了一些明显的东西。
最佳答案
我认为您的问题与此类似:Android:android.view.ViewRoot$CalledFromWrongThreadException - How to solve the problem?
作为 bhatt4982 的回答,您可以使用 Handler .从它的文档:
“Handler 有两个主要用途:(1) 安排消息和可运行对象在未来某个时间点执行;(2) 将要在与您自己的线程不同的线程上执行的操作排队。 ".
AshtonBRSC 的答案也很好,您可以将 UI 更新包含在 Runnable 中并使用 runOnUiThread Activity 的方法。
关于java - 如何处理 Observer 中的数据输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2598390/