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

问题描述:

我有一个Observable和一个Observer。 observable在后台线程中下载了一些东西,并调用notifyObservers让观察者阅读状态。如何处理Observer中的数据输出?

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。从它的文档:

“处理程序有两个主要用途:(1)安排将来要执行的消息和可运行列表;以及(2)排除要在不同的线程比你自己的要多。“

来自的答案AshtonBRSC也不错,您可以将您的UI更新放在Runnable中并使用runOnUiThread Activity的方法。