2013-01-12 13 views
10

Sto cercando di ottenere un ImageView per animare tra 2 immagini nella mia cartella disegnabile.Solo il thread originale che ha creato una gerarchia di viste può toccare le sue viste

ho pensato che tutto avrebbe funzionato bene, ma il registro sta mostrando un errore: Only the original thread that created a view hierarchy can touch its views.

Heres il mio codice:

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)); 
     } 
    } 
} 

sono andato avanti e impostare le classi e le funzioni di pubblico, ma che non ha aggiustalo.

Tutte le risorse e tutto è a posto, come posso risolvere questo errore?

+0

Si dovrebbe dare lo stack completo, sarà utile ... –

+0

Eventuali duplicati di [Android "Solo il thread originale che ha creato una gerarchia vista può toccare le sue opinioni."] (Https: // StackOverflow. it/questions/5161951/android-only-the-original-thread-that-created-a-view-hierarchy-can-touch-its-vi) –

risposta

37

il codice in TickClass viene eseguito su un altro thread. Per eseguire l'interfaccia utente da qui utilizzare runOnUiThread. Vedere il docu per i dettagli.

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

ha funzionato molto bene. – scarhand

+0

come si fa su un frammento? – jonney

+1

@jonney one way is 'getActivity(). RunOnUiThread (...)' – Henry

3

È necessario utilizzare un gestore. http://developer.android.com/reference/android/os/Handler.html

creare il gestore nel onCreate. Quindi utilizzare il gestore con l'altro thread. Avvolgere il codice all'interno del post e questo codice verrà eseguito sul thread dell'interfaccia utente che potrebbe modificare i componenti dell'interfaccia utente.

"post booleano finale pubblica (Runnable r) Aggiunto a livello di API 1

Provoca la r Runnable da aggiungere alla coda di messaggi. L'eseguibile verrà eseguito il filo a cui è collegato questo gestore. "

handler.post(new Runnable() { 

     @Override 
     public void run() { 
      image_1_view.setImageDrawable(getResources().getDrawable(resourceId)); 
     } 
    }); 
Problemi correlati