2013-01-12 6 views
10

Próbuję uzyskać obraz, aby animować między 2 obrazami w folderze do rysowania.Tylko oryginalny wątek, który utworzył hierarchię widoku, może dotykać swoich widoków.

Myślałem, wszystko będzie działać dobrze, ale dziennik pokazuje błąd: Only the original thread that created a view hierarchy can touch its views.

Herezje mój kod:

public class ExerciseActivity extends Activity { 
    private ExercisesDataSource datasource; 
    private Cursor cursor; 
    private ImageView image_1_view; 
    private Timer _timer; 
    private int _index; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_exercise);  

     datasource = new ExercisesDataSource(this); 
     datasource.open(); 

     cursor = datasource.fetchExercise(exerciseDataID); 

     image_1_view = (ImageView) findViewById(R.id.exercise_image); 

     _index = 1; 
     _timer = new Timer(); 
     _timer.schedule(new TickClass(), 1000); 

    } 

    public class TickClass extends TimerTask 
    { 
     private int columnIndex; 

     @Override 
     public void run() { 
      if (_index == 1) { 
       columnIndex = cursor.getColumnIndex(MySQLiteHelper.COLUMN_IMAGE_1); 
       _index = 2; 
      } 
      else { 
       columnIndex = cursor.getColumnIndex(MySQLiteHelper.COLUMN_IMAGE_2); 
       _index = 1; 
      } 

      String image_1 = cursor.getString(columnIndex); 
      image_1 = image_1.replace(".png", ""); 
      int resourceId = getResources().getIdentifier(getPackageName() + ":drawable/" + image_1, null, null); 
      image_1_view.setImageDrawable(getResources().getDrawable(resourceId)); 
     } 
    } 
} 

poszedł do przodu i ustawić klas i funkcje publiczne, ale to nie napraw to.

Wszystkie zasoby i wszystko w porządku, jak naprawić ten błąd?

+0

Należy podać pełny stos, to będzie pomocne ... –

+0

Możliwy duplikat [Android „Tylko oryginalne nici, które stworzył hierarchię widok może dotknąć swoje poglądy”.] (Https: // stackoverflow. com/questions/5161951/android-only-the-original-thread-that-created-a-view-hierarchy-can-touch-its-vi) –

Odpowiedz

37

Twój kod w TickClass działa na innym wątku. Aby wykonać pracę interfejsu użytkownika z tego miejsca, użyj runOnUiThread. Aby uzyskać szczegółowe informacje, patrz docu.

runOnUiThread(new Runnable() { 
    public void run() { 
     image_1_view.setImageDrawable(getResources().getDrawable(resourceId)); 
    } 
}); 
+0

to działało, wielkie dzięki. – scarhand

+0

jak to zrobić w przypadku fragmentu? – jonney

+1

@jonney w jedną stronę to 'getActivity(). RunOnUiThread (...)' – Henry

3

Powinieneś użyć Handler. http://developer.android.com/reference/android/os/Handler.html

Utwórz przewodnik w module onCreate. Następnie użyj programu obsługi z innym wątkiem. Owiń kod wewnątrz posta, a ten kod zostanie wykonany w wątku interfejsu użytkownika, który może zmienić składniki interfejsu użytkownika.

„publiczny końcowy logiczna słupek (Runnable R) Dodano poziomu API 1

Powoduje Runnable R, który ma być dodany do kolejki wiadomości. Na uruchamialny zostanie uruchomiony na gwint, do którego jest dołączony uchwyt ten. "

handler.post(new Runnable() { 

     @Override 
     public void run() { 
      image_1_view.setImageDrawable(getResources().getDrawable(resourceId)); 
     } 
    }); 
Powiązane problemy