2012-06-26 5 views
8

Mögliche Duplizieren:
Android - ViewRootImpl$CalledFromWrongThreadException

Im Versuch Bild von meiner URL und Anzeige in der Anwendung zu bekommen, aber es wirft Fehler Verursacht von: android.view.ViewRootImpl $ CalledFromWrongThreadException: Nur der ursprüngliche Thread, der eine Ansichtshierarchie erstellt hat, kann seine Ansichten berühren. Unten ist mein Code

-Code

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

tut mir leid, mein böser ... Ich habe diese Frage früher gestellt. Danke für die Updates. –

+1

Die Änderungen in der Benutzeroberfläche müssen in 'onPostExecute' – CaffeineShots

Antwort

35

Bad Praxis der Verwendung von AsyncTask,

Sie versuchen, Ihr Haupt UI-Thread von doInBackGround() zu aktualisieren, da AsyncTask nie erlaubt.

Aktualisieren Sie Ihre Benutzeroberfläche nie von doInBackGround() von AsyncTask als seinen einzigen Arbeitsthread. So schreiben Sie Ihre Haupt UI updatation Code in onPostExecute() Methode von 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

gemacht werden, warum Sie schlechte Praxis gesagt haben ... bitte beraten. Thansk –

6

wird fügen Sie einige Punkte auf, was @ user370305 Said,

Sie nicht UI-Elemente in nicht-UI-Thread berühren kann.

Wenn Sie AsyncTaskdoInBackground verwenden, wird in non-ui-Thread ausgeführt, so dass Sie nicht auf ImageView zugreifen können.

Sie können in onPreExecute, onProgressUpdate & onPostExcecute auf UI-Elemente zugreifen.

Verwandte Themen