2013-05-31 5 views
1

Я пытаюсь обновить свой интерфейс пользователя из 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? Спасибо заранее!

+0

Вы не можете обновить ui из фоновой темы, используя runonuithread. http://stackoverflow.com/questions/16822534/how-to-use-timer-threads-and-views/16822744#16822744. Проверьте часть runonuithread ответа. Вы должны обновить ui на UI thead. – Raghunandan

+0

Хорошо, я попробую rundonuithread, но я не понимаю, почему обработчик не работает. Многие люди предлагают использовать обработчик. – Shataya

+0

вы также можете использовать обработчик. это не должно быть проблемой. Но убедитесь, что вы не обновляете ui в фоновом потоке – Raghunandan

ответ

0

Я нашел мою ошибку. Я должен позвонить

this.mVideoPlayer.sendMessage(msg); 

вместо отправки сообщения (msg). Затем мой обработчик работает по потоку пользовательского интерфейса.

0

Я не знаю, о том, что обратного вызова подклассов вы делаете, но обработчик должен работать нормально, только две вещи, чтобы сделать:

  • Вы можете создать обработчик в потоке, он должен размещать код к.

  • Вы используете handler.post() - метод пост он источник в потоке пользовательского интерфейса, например:

handler.post(new Runnable() { 
    @Override 
    public void run() { 
     drawStuffToScreen(); 
    } 
}); 
Смежные вопросы