代码之家  ›  专栏  ›  技术社区  ›  whlk

如何在观察者中处理数据输出?

  •  1
  • whlk  · 技术社区  · 14 年前

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

    有什么办法可以阻止这种事情发生吗?我肯定我漏掉了一些明显的东西。

    1 回复  |  直到 14 年前
        1
  •  5
  •   Community CDub    7 年前

    我认为你的问题和这个类似: Android:android.view.ViewRoot$CalledFromWrongThreadException - How to solve the problem?

    巴特4982 答案在那里,你可以用 Handler . 根据其文件:

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

    阿什顿布尔斯克 也很好,您可以将UI更新封装在Runnable中并使用 runOnUiThread 活动的方法。