2013-02-23 4 views
0

Я создаю пользовательский GalleryView, и он работает с моими устройствами (Samsung Galaxy S III & Nexus 4). Но когда я пытаюсь использовать его в своем эмуляторе, я получил следующие ошибки! !!onKeyDown() не работает в расширенном классе

02-24 01:01:03.593: E/AndroidRuntime(3429): FATAL EXCEPTION: Thread-11 
02-24 01:01:03.593: E/AndroidRuntime(3429): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
02-24 01:01:03.593: E/AndroidRuntime(3429):  at android.view.ViewRoot.checkThread(ViewRoot.java:2802) 
02-24 01:01:03.593: E/AndroidRuntime(3429):  at android.view.ViewRoot.playSoundEffect(ViewRoot.java:2581) 
02-24 01:01:03.593: E/AndroidRuntime(3429):  at android.view.View.playSoundEffect(View.java:8516) 
02-24 01:01:03.593: E/AndroidRuntime(3429):  at android.widget.Gallery.onKeyDown(Gallery.java:1109) 
02-24 01:01:03.593: E/AndroidRuntime(3429):  at com.example.coverflow.ui.galleryView$1.run(galleryView.java:55) 
02-24 01:01:03.593: E/AndroidRuntime(3429):  at java.lang.Thread.run(Thread.java:1096) 

Эти ошибки упомянуть следующие строки моего кода:

public void startSlideShow(final int periodTime) 
{ 
    final Runnable __runnable = new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      if (!isTouched) 
       galleryView.this.onKeyDown(KeyEvent.KEYCODE_DPAD_RIGHT, null); 
      mHandler.postDelayed(this, periodTime);    
     } 
    }; 
    new Thread(__runnable).start(); 

    this.setOnTouchListener(new View.OnTouchListener() 
    { 
     @Override 
     public boolean onTouch(View view, MotionEvent event) 
     { 
      int currentEvent = event.getAction(); 
      if (currentEvent == MotionEvent.ACTION_DOWN 
        || currentEvent == MotionEvent.ACTION_MOVE) 
       isTouched = true; 
      else 
      { 
       isTouched = false; 
       // Reset handler 
       mHandler.removeCallbacks(__runnable); 
       mHandler.postDelayed(__runnable, periodTime); 
      } 
      return false; 
     } 
    }); 
} 

Линия 55 являетсяgalleryView.this.onKeyDown(KeyEvent.KEYCODE_DPAD_RIGHT, null);

Что я должен сделать, чтобы избежать этой проблемы?

ответ

1

Вы пытаетесь обновить интерфейс из другого потока, кроме потока пользовательского интерфейса.

Как ошибка говорит:

Only the original thread that created a view hierarchy can touch its views. 

Попробуйте обертывание ваш код доступа к файлам с runOnUIThread(new Runnable{ ... }())

Пример: Can i have an example of displaying a toast using runOnUiThread.

+0

Так почему он работал с моим телефоном и не работает в эмуляторе !? – NullPointer

+0

Это исключение должно быть брошено на обоих, и вы, вероятно, что-то изменили между прогонами. – Timmetje

Смежные вопросы