Android – Causado por: android.view.ViewRootImpl $ CalledFromWrongThreadException

Posible duplicado:
Android – ViewRootImpl $ CalledFromWrongThreadException

Im tratando de obtener la imagen de mi URL y mostrar en la aplicación, pero arrojar error Caused by: android.view.ViewRootImpl $ CalledFromWrongThreadException: Sólo el hilo original que creó una jerarquía de vista puede tocar sus vistas . A continuación se muestra mi código

Código

package com.smartag.bird.dev; public class MainActivity extends Activity { static String ndefMsg = null; static String ndefMsg1 = null; NfcAdapter mNfcAdapter; PendingIntent mNfcPendingIntent; IntentFilter[] mNdefExchangeFilters; static final String TAG = "Read Tag"; TextView mTitle; private static ImageView imageView; static String url = "http://sposter.smartag.my/images/chicken_soup.jpg"; private static Bitmap downloadBitmap; private static BitmapDrawable bitmapDrawable; private static boolean largerImg = false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentView(R.layout.main); mNfcAdapter = NfcAdapter.getDefaultAdapter(this); mNfcPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); IntentFilter ndefDetected = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED); try { ndefDetected.addDataType("text/plain"); } catch (MalformedMimeTypeException e) { } mNdefExchangeFilters = new IntentFilter[] { ndefDetected }; if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) { NdefMessage[] messages = getNdefMessages(getIntent()); byte[] payload = messages[0].getRecords()[0].getPayload(); ndefMsg = new String(payload); setIntent(new Intent()); // Consume this intent. } ConnectivityManager connManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); if(ndefMsg == null || ndefMsg.length() == 0) { startActivity(new Intent(MainActivity.this, MainMenu.class)); } else { setContentView(R.layout.main); if (mWifi.isConnected()) { ndefMsg1 = ndefMsg; new DownloadFilesTask().execute(); ndefMsg = null; } else { AlertDialog.Builder dialog = new AlertDialog.Builder(this); dialog.setTitle("Attention"); dialog.setMessage("No Internet Connection. Please enable the wifi."); dialog.setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { } }); dialog.show(); } } } private class DownloadFilesTask extends AsyncTask<Void, Void, Void> { protected void onPostExecute(Void result) { } @Override protected Void doInBackground(Void... params) { try { URL myFileUrl = new URL("http://sposter.smartag.my/images/chicken_soup.jpg"); HttpURLConnection conn= (HttpURLConnection)myFileUrl.openConnection(); conn.setDoInput(true); conn.connect(); InputStream is = conn.getInputStream(); downloadBitmap = BitmapFactory.decodeStream(is); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } ImageView image = (ImageView) findViewById(R.id.imview); image.setImageBitmap(downloadBitmap); return null; } } } 

Mala práctica de uso de AsyncTask ,

Está intentando actualizar su subproceso de interfaz principal de doInBackGround() como AsyncTask nunca lo permitió.

Nunca actualice su interfaz de usuario de doInBackGround() de AsyncTask como su único subproceso de trabajo. Así que escriba su código de actualización principal UI en el método onPostExecute() de AsyncTask ..

 @Override protected Void doInBackground(Void... params) { try { URL myFileUrl = new URL("http://sposter.smartag.my/images/chicken_soup.jpg"); HttpURLConnection conn= (HttpURLConnection)myFileUrl.openConnection(); conn.setDoInput(true); conn.connect(); InputStream is = conn.getInputStream(); downloadBitmap = BitmapFactory.decodeStream(is); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } @Override onPostExecute() { ImageView image = (ImageView) findViewById(R.id.imview); image.setImageBitmap(downloadBitmap); } 

Va a añadir algunos puntos a lo que @ user370305 Dijo,

No puede tocar elementos de interfaz de usuario en un subproceso no-ui.

Si está utilizando AsyncTask doInBackground se ejecuta en un hilo no-ui, por lo que no puede acceder a ImageView en eso.

Puede acceder a los elementos de la interfaz de usuario en onPreExecute , onProgressUpdate y onPostExcecute .

  • Uso de ksop2 para enviar archivos grandes al servicio web
  • No se puede instanciar actividad- ClassNotFoundException
  • Android sincronizado onSensorChanged?
  • R.id no se puede resolver
  • Cómo implementar pull para actualizar en un ListFragment
  • Lectura de un archivo XML desde recursos
  • CircleCI Android No soportado major.minor versión 52.0
  • ¿Cómo ver las fotos tomadas en Android sin utilizar la base de datos?
  • Capture la pantalla de Android y cree el video programáticamente
  • Cómo descartar el teclado en appium con Java?
  • Cómo quitar una tarea de ScheduledExecutorService?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.