我正在尝试使用处理程序从GLThread更新我的UI。我已经读过“handleMessage”中的所有内容都将在UI线程中执行但我仍然会遇到此异常:
05-31 09:22:55.653: E/AndroidRuntime(26273): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
这是我的经纪人:
public class VideoPlayerCallback implements Handler.Callback {
public static final int PLAY = 0;
public static final int STOP = 1;
public boolean handleMessage(Message msg) {
if(msg.what == VideoPlayerCallback.PLAY) {
ARVideoTemplate videoTemp = (ARVideoTemplate) msg.obj;
String uriPath = "android.resource://" + getPackageName() +"/raw/"+videoTemp.getFileName();
updateVideo(uriPath); // UI Actions
return true;
}
else if(msg.what == VideoPlayerCallback.STOP){
updateVideo(null); // UI Actions
return true;
}
return false;
}
}
然后将这个处理程序放到我的GLRenderer中
Handler player = new Handler(new VideoPlayerCallback());
((ARGLSurfaceView) mGLSurfaceView).setVideoView(player);
来自GLRenderer的电话:
Message msg = Message.obtain(mVideoPlayer);
msg.obj = video;
msg.what = VideoPlayerCallback.PLAY;
this.mVideoPlayer.dispatchMessage(msg);
我应该更改什么才能正确访问ui线程? 提前谢谢!
答案 0 :(得分:0)
我不知道你正在做的回调子类化,但是处理程序应该可以正常工作,只需做两件事:
您在应该将代码发布到的线程上创建处理程序。
您使用handler.post() - 方法将源代码发布到UI线程,如下所示:
handler.post(new Runnable() {
@Override
public void run() {
drawStuffToScreen();
}
});
答案 1 :(得分:0)
我发现了自己的错。我得打电话
this.mVideoPlayer.sendMessage(msg);
而不是dispatchMessage(msg)。然后我的处理程序在UI线程上运行。