我有两个类:一个控制多个小部件的活动类,然后是一个实现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中使用单独的处理程序线程,因为我确切知道何时更新值。
答案 0 :(得分:0)
因为您只能从UI线程访问视图。每个应用程序都有一个UI线程。现在您从另一个不正确的线程访问视图并导致异常。
你可以这样做:
在Activity的onChange中包装runOnUiThread中的所有内容
或更好:
使用处理程序代替您自己的侦听器(需要一些学习但需要付费)