0

我有两个类:一个控制多个小部件的活动类,然后是一个实现线程的自定义 SurfaceView 类。(很常见)。我在 SurfaceView 类中实现了一个简单的自定义侦听器,只要我想在 Activity 类的各种小部件中更新线程中的某些值更改,我就可以触发该侦听器。

public class MyActivity extends Activity{

    CustomView myThreadView = (CustomView)findViewById(...);

    myThreadView.setListener(new OnStatChangeListener(){
        public void onChange(int change){
            //Change various widgets based on value fed in.
        }
    });

    // All of the other things (View setups, listeners, onCreate, etc.)
}

线程类:

public class CustomView extends SurfaceView implements Runnable(){
    //.. The usual thread and View stuff.

    public sListener;

    public interface OnStatChangeListener {
        public onChange(int change);
    }

    public void setListener(OnStatChangeListener oscl){
        sListener = oscl;
    }

    public void externalAccessMethod(){
        // Some thing changes a stat that is reflected in the Activity's widgets.
        sListener.onChange(value);
    }

    public void methodRunByThread(){
        // Something else changes that I want to update.
        sListener.onChange(value);
    }

    // Everything else (not relevant).
}

每当我从 Activity 的类调用的方法中调用 onChange 时,它​​都可以正常工作。但是,每当线程本身更新它的状态(在我的例子中是一个重绘方法)并且我调用 onChange 方法时,我都会得到一个 CalledFromWrongThread 异常。有人可以解释为什么一个有效而另一个无效,以及从单独的线程实际实现小部件更新的最佳实践是什么?Activity 中的单独处理程序线程似乎没有必要,因为无论如何我都知道何时更新值。

4

1 回答 1

0

因为您只能从 UI 线程访问视图。每个应用程序有一个 UI 线程。现在您从另一个不正确的线程访问视图并导致异常。

你可以这样做:

在你的 Activity 的 onChange 中,将所有内容都包装在 runOnUiThread

或更好:

使用处理程序而不是您自己的听众(需要一些学习但要付费)

于 2012-09-26T19:03:20.050 回答