android.os.NetworkOnMainThreadException異常怎么解決


很多教程上有關網絡訪問的代碼,最簡單的有類似這樣的:

        ImageView imgV = (ImageView) findViewById(R.id.imageView1);
        try {
            URL url = new URL("http://url地址");
            InputStream is = url.openStream();
            Bitmap bm = BitmapFactory.decodeStream(is);
            imgV.setImageBitmap(bm);
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

但是就是這個如此簡單的代碼也可能讓你折騰死,報android.os.NetworkOnMainThreadException異常無法運行。這個異常大概意思是在主線程訪問網絡時出的異常Android在4.0之前的版本支持在主線程中訪問網絡,但是在4.0以后對這部分程序進行了優化,也就是說訪問網絡的代碼不能寫在主線程中了

解決方法:多線程,異步加載的方式加載數據

具體方法就是各種多線程/異步的實現,如下述方法之一。

new Thread() {
      @Override
      public void run() {
         // 需要執行的方法
         // 執行完畢后給handler發送一個空消息
         handler.sendEmptyMessage(0);
      }
}.start();

//定義Handler對象
private Handler handler = new Handler() {
    //當有消息發送出來的時候就執行Handler的這個方法來處理消息分發
    @Override
    public void handleMessage(Message msg) {
           super.handleMessage(msg);
           //處理UI
    }
};

也可以用AsyncTask來實現

class DownImage extends AsyncTask {
   private ImageView imageView;
   
    public DownImage(ImageView imageView) {
         //TODO Auto-generated method stub
          this.imageView = imageView;
    }

     @Override
     protected Bitmap doInBackground(String...  params) {
           //TODO Auto-generated method stub
           String url = params[0];
           Bitmap bitmap = null;
           try {
               InputStream is = new URL(url).openStream();
               bitmap = BitmapFactory.decodeStream(is);
           } catch(Exception e) {
                e.printStackTrace();
           }
           return bitmap;   
     }

     @Override
     protected void onPostExecute(Bitmap result) {
           //TODO Auto-generated method stub
           imageView.setImageBitmap(result);
     }
}

還有可以用StrictMode進行線程策略規划

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM