Я пытаюсь обновить свой интерфейс пользователя из GLThread с помощью обработчика. Я прочитал, что все в «handleMessage» будет выполняться в UI тему, но я все еще получаю это исключение:Обновление пользовательского интерфейса от GLThread
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? Спасибо заранее!
Вы не можете обновить ui из фоновой темы, используя runonuithread. http://stackoverflow.com/questions/16822534/how-to-use-timer-threads-and-views/16822744#16822744. Проверьте часть runonuithread ответа. Вы должны обновить ui на UI thead. – Raghunandan
Хорошо, я попробую rundonuithread, но я не понимаю, почему обработчик не работает. Многие люди предлагают использовать обработчик. – Shataya
вы также можете использовать обработчик. это не должно быть проблемой. Но убедитесь, что вы не обновляете ui в фоновом потоке – Raghunandan