从GLThread更新UI

时间:2013-05-31 07:41:05

标签: android opengl-es-2.0

我正在尝试使用处理程序从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线程? 提前谢谢!

2 个答案:

答案 0 :(得分:0)

我不知道你正在做的回调子类化,但是处理程序应该可以正常工作,只需做两件事:

  • 您在应该将代码发布到的线程上创建处理程序。

  • 您使用handler.post() - 方法将源代码发布到UI线程,如下所示:

handler.post(new Runnable() {
    @Override
    public void run() {
        drawStuffToScreen();
    }
});

答案 1 :(得分:0)

我发现了自己的错。我得打电话

this.mVideoPlayer.sendMessage(msg);

而不是dispatchMessage(msg)。然后我的处理程序在UI线程上运行。