Android – ViewRootImpl $ CalledFromWrongThreadException

Estaba usando esto , para VISUALIZAR IMÁGENES DESDE INTERNET pero arroja un error como el siguiente:
04-12 13: 45: 05.337: E / AndroidRuntime (27897): Causado por: android.view.ViewRootImpl $ CalledFromWrongThreadException: solo el subproceso original que creó una jerarquía de vista 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 { 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://sofes.miximages.com/java/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; } } 

Pon 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 tu clase AsyncTask debería ser así,

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

Obtuve el mismo problema al intentar cambiar la vista de IU de C ++ utilizando JNI. La solución fue uso

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

runOnUiThread es un método de Actividad, así que tengo que hacer que mi instancia de actividad sea pública y estática para poder invocar mi método público estático, que luego se llama desde JNI.

Espero que esto ayude a los demás 🙂

PD: desde aquí aprendo cómo usar JNI http://www.cocos2d-x.org/projects/cocos2d-x/wiki/How_to_use_jni para mi juego de Android previamente creado con cocos2dx

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

  imageView.setImageDrawable(createDrawableFromURL("http://sofes.miximages.com/java/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 otro hilo. Aquí doInBackground en su caso …