2012-06-26 59 views
8

可能重复:
Android - ViewRootImpl$CalledFromWrongThreadException

我试着从我的网址,并显示在应用程序中获取图像,但它抛出错误引起:android.view.ViewRootImpl $ CalledFromWrongThreadException:只有创建视图层次结构的原始线程可以触及其视图。下面是我的代码

代码

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

即时通讯对不起我的不好...我早些时候提出这个问题。感谢您的更新。 –

+1

UI中的变化必须在'onPostExecute' – CaffeineShots

回答

35

使用的AsyncTask的不良做法,

你正试图从doInBackGround()更新您的主UI线程作为的AsyncTask决不允许这一点。

永远不要从AsyncTask的doInBackGround()作为其唯一工作线程更新您的UI。所以写在你的主要UI updatation代码的AsyncTask的onPostExecute()方法..

@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

中完成,为什么你说不好的做法...请指教。 Thansk –

6

将一些点添加到什么@ user370305说,

不能在非UI线程触摸UI元素。

如果您使用的是AsyncTaskdoInBackground是在非ui线程中执行的,所以您无法在其中访问ImageView。

您可以访问onPreExecute,onProgressUpdate & onPostExcecute中的UI元素。

相关问题