2012-06-26 21 views
8

Duplicar posibles:
Android - ViewRootImpl$CalledFromWrongThreadException

Im tratando de obtener una imagen de mi URL y mostrarlos en la aplicación pero tirar de error Causado por: android.view.ViewRootImpl $ CalledFromWrongThreadException: solo el subproceso original que creó una jerarquía de vista puede tocar sus vistas. A continuación se muestra el 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; 
     } 
    } 
} 
+0

lo siento mi mal ... he planteado esta pregunta antes. Gracias por las actualizaciones. –

+1

los cambios en la interfaz de usuario se deben hacer en 'onPostExecute' – CaffeineShots

Respuesta

35

malas prácticas de uso de AsyncTask,

Usted está intentando actualizar su interfaz de usuario Tema principal de doInBackGround() como AsyncTask nunca permitió que eso.

Nunca actualice su UI desde doInBackGround() de AsyncTask como su único hilo de trabajo. Así que escribir el código de la interfaz de usuario principal en updatation onPostExecute() método 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); 
} 
+3

por qué dijiste malas prácticas ... por favor consejo. Thansk –

6

añadirá algunos puntos a lo @ user370305 Said,

No se puede tocar la interfaz de usuario Elementos de rosca no ui.

Si está utilizando AsyncTaskdoInBackground se ejecuta en un subproceso que no es de la interfaz de usuario, por lo que no puede acceder a ImageView.

Puede acceder a los elementos de la IU en onPreExecute, onProgressUpdate & onPostExcecute.

Cuestiones relacionadas