Sólo el subproceso original que creó una jerarquía de vistas puede tocar sus vistas

Estoy tratando de obtener un ImageView para animar entre 2 imágenes en mi carpeta dibujable.

Pensé que todo funcionaría bien, pero el registro muestra un error: Only the original thread that created a view hierarchy can touch its views.

Heres mi código:

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

Fui adelante y fijé las clases y las funciones al público pero eso no lo arregló.

Todos los recursos y todo está bien, ¿cómo puedo solucionar este error?

Su código en TickClass ejecuta en otro subproceso. Para hacer trabajo de IU desde aquí, utilice runOnUiThread . Vea el documento para más detalles.

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

Debe utilizar un controlador. http://developer.android.com/reference/android/os/Handler.html

Cree el controlador en el onCreate. A continuación, utilice el controlador con el otro hilo. Envuelva el código dentro de la publicación y este código se ejecutará en el subproceso de interfaz de usuario que puede cambiar los componentes de interfaz de usuario.

"Public final boolean post (Runnable r) Añadido en API nivel 1

Hace que Runnable r se agregue a la cola de mensajes. El runnable se ejecutará en el subproceso al que está conectado este controlador. "

  handler.post( new Runnable() { @Override public void run() { image_1_view.setImageDrawable(getResources().getDrawable(resourceId)); } }); 
  • Cómo cambiar dinámicamente la altura de ImageView
  • Vista de imagen que no envuelve contenido
  • Android ¿Arrastrar y soltar imágenes en la pantalla?
  • Cómo almacenar y recuperar el mapa de bits en sharedPreferences en Android?
  • Cómo agregar una sombra y un borde en circular imageView android?
  • Cómo borrar ImageView correctamente?
  • Cómo encontrar la intersección entre dos ImageView cuando arrastrar y soltar?
  • Escala de ImageView al ancho del dispositivo
  • Escala de imagen para rellenar el ancho de ImageView y mantener la relación de aspecto
  • Android imageview toma espacio extra negro
  • Android - ViewRootImpl $ CalledFromWrongThreadException
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.