我有两个类:一个控制多个小部件的活动类,然后是一个实现线程的自定义 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 中的单独处理程序线程似乎没有必要,因为无论如何我都知道何时更新值。