使用侦听器从线程访问活动

时间:2012-09-26 18:57:37

标签: android android-view android-handler

我有两个类:一个控制多个小部件的活动类,然后是一个实现Thread的自定义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.)
}

Thread类:

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中使用单独的处理程序线程,因为我确切知道何时更新值。

1 个答案:

答案 0 :(得分:0)

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

你可以这样做:

在Activity的onChange中包装runOnUiThread中的所有内容

或更好:

使用处理程序代替您自己的侦听器(需要一些学习但需要付费)