whl*_*hlk 1 java multithreading android exception observer-pattern
我有一个Observable和一个Observer.observable会在后台线程中下载一些东西并调用notifyObservers让观察者读取状态.
在某些时候,public void update观察者试图更新GUI
((TextView)findViewById('R.id.foo')).setText("bar");
Run Code Online (Sandbox Code Playgroud)
但似乎可观察线程调用此方法,因为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)
Run Code Online (Sandbox Code Playgroud)
有什么办法可以防止这种情况发生吗?我确定我在这里遗漏了一些明显的东西.
我认为你的问题与此类似:Android:android.view.ViewRoot $ CalledFromWrongThreadException - 如何解决问题?
正如bhatt4982在那里的答案,你可以使用Handler.从它的文档:
"处理程序有两个主要用途:(1)将消息和可运行程序安排在将来的某个点上执行;以及(2)将要在不同于自己的线程上执行的操作排入队列."
AshtonBRSC的答案也很好,您可以将您的UI更新包含在Runnable中并使用runOnUiThread Activity的方法.
| 归档时间: |
|
| 查看次数: |
792 次 |
| 最近记录: |