Android – ViewRootImpl $ CalledFromWrongThreadException

Yo estaba usando esto , para mostrar las imágenes de Internet, pero arroja un error como a continuación:
$ CalledFromWrongThreadException: Sólo el subproceso original que creó una jerarquía de vistas puede tocar sus vistas.

public class Order extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); new DownloadFilesTask().execute(); } private class DownloadFilesTask extends AsyncTask<Void, Void, Void> { protected void onPostExecute(Void result) { } @Override protected Void doInBackground(Void... params) { setContentView(R.layout.order); ImageView imageView = (ImageView)findViewById(R.id.imgView); imageView.setImageDrawable(createDrawableFromURL("http://savagelook.com/misc/sl_drop2.png")); return null; } } private Drawable createDrawableFromURL(String urlString) { Drawable image = null; try { URL url = new URL(urlString); InputStream is = (InputStream)url.getContent(); image = Drawable.createFromStream(is, "src"); } catch (MalformedURLException e) { image = null; } catch (IOException e) { image = null; } return image; } } 

Poner esto en onCreate()

 ImageView imageView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.order); imageView = (ImageView)findViewById(R.id.imgView); new DownloadFilesTask().execute(); } 

Y su clase AsyncTask debe ser así,

  private class DownloadFilesTask extends AsyncTask<Void, Void, Void> { Drawable drawable; @Override protected Void doInBackground(Void... params) { drawable = createDrawableFromURL( "http://savagelook.com/misc/sl_drop2.png"); return null; } protected void onPostExecute(Void result) { imageView.setImageDrawable(drawable); } } 

Tengo el mismo problema tratando de cambiar la vista de interfaz de usuario de c + + utilizando JNI. La solución fue usar

 runOnUiThread(new Runnable() { public void run(){ } }); 

RunOnUiThread es un método Activity por lo que tengo que hacer mi instancia de actividad pública estática para poder llamar a mi método estático público que más tarde llamar desde JNI.

Espero que esto ayude a otros 🙂

PS: desde aquí aprendo a usar JNI http://www.cocos2d-x.org/projects/cocos2d-x/wiki/How_to_use_jni para mi juego de Android previamente realizado con cocos2dx

Creo que esta línea está causando el error ..

  imageView.setImageDrawable(createDrawableFromURL("http://savagelook.com/misc/sl_drop2.png")); 

Y el error explica por qué es así ..

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

Este error se debe a que está intentando cambiar la interfaz de usuario en mainthread de algún otro hilo .. aquí doInBackground en su caso …

  • Android imageview toma espacio extra negro
  • Fuera de la memoria de carga imageViews
  • Establecer imagen desde android.R.drawable en vista de la imagen android
  • Android 4.0 ImageView setImageBitmap no funciona
  • El selector no funciona con el diseño y la vista de imagen
  • Androide: estira la imagen en la vista de la imagen para que se ajuste a la pantalla
  • ImageView muestra espacio en blanco en la parte superior e inferior de la imagen
  • Ocultar y eliminar la imagen en la vista de imagen de Android
  • Cambiar imagen de ImageView por programación Android
  • Vista de imagen que no envuelve contenido
  • Hacer una imagen a pantalla completa en la aplicación de tutorial para Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.