java - 如何处理 Observer 中的数据输出?

标签 java android exception multithreading observer-pattern

我有一个 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/

相关文章:

java合并两个链表

安卓 : How to change Playback Rate of music using OpenSL ES

android - 谷歌开发者电话

java - 如何使用 solr 索引 sqlite 数据库

java - mysql 上(ER_QUERY_INTERRUPTED)的处理策略

tomcat - Grails 自定义错误页面 (500) 和 Tomcat

java - 应用归并排序逻辑

java - Eclipse Indigo 64 位严重内存泄漏

java - 从java程序内部执行linux命令

android - 如何从 webChromeClient 启动另一个 Activity