2011-09-13 34 views
8

我知道,當你試圖在UI線程上做某種網絡請求時,會發生這個錯誤,但正如你在下面的代碼中看到的,我實際上調用了Http在AsyncTask中獲取:在AsyncTask中的android.os.NetworkOnMainThreadException

public class LeftPaneFragment extends Fragment { 

    private ImageView _profileImage; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(wj.tweetTab.R.layout.left_pane, container); 

     _profileImage = (ImageView) view.findViewById(R.id.profileImage); 

     setUpProfileInfo(view); 

     return view; 
    } 

    private void setUpProfileInfo(View view) {   
     new SetUpUserInfo().doInBackground(); 
    } 

    private class SetUpUserInfo extends AsyncTask<Void, Void, Drawable> { 

     @Override 
     protected Drawable doInBackground(Void... params) { 

      DefaultHttpClient httpClient = new DefaultHttpClient(); 
      HttpGet request = new HttpGet(_model.UserInfo.ProfileImageUrl); 

      InputStream inputStream = null; 

      try { 
       HttpResponse response = httpClient.execute(request);   
       inputStream = response.getEntity().getContent(); 
      } 
      catch (Exception e) {    
       Log.e("setUpUserInfo.doInBackground", e.getMessage()); 
      } 

      return Drawable.createFromStream(inputStream, "src"); 
     } 

     @Override 
     protected void onPostExecute(Drawable result) { 
      _profileImage.setImageDrawable(result); 
     } 
    } 
} 

任何人都可以在這裏看到任何明顯的問題?除了在主線程中執行http請求之外,還可以因爲其他原因拋出NetworkOnMainThreadException異常嗎?

我是Android的新手,只用了幾天。

回答

22

但你可以在代碼中看到下面我其實調用的Http 得到一個的AsyncTask

你不是,其實。你需要調用​​而不是直接調用doInBackground(),否則你沒有使用AsyncTask提供的任何管道,而只是直接在UI線程中調用該方法。

+0

啊哈謝謝你我的朋友! – jcvandan

+0

我已經絆倒了好幾次,並且已經接近使用線程多次(啓動與運行)。爲什麼'doInBackground()'在它沒用時甚至可用? – 2013-04-26 19:50:20

+1

呃......你的意思是「可用」是什麼意思?首先,它是'protected',這意味着你不應該從AsyncTask之外的類中調用它。不幸的是,許多人只是聲明AsyncTasks內聯,以便他們可以(並且)調用'doInBackground()'。 'execute()'然而,*是*'public'。 – dmon

1

也許Android SDK版本高(版本> = 3.0)。

嘗試添加代碼

import android.os.StrictMode;

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() 
     .detectDiskReads() 
     .detectDiskWrites() 
     .detectNetwork() // or .detectAll() for all detectable problems 
     .penaltyLog() 
     .build()); 

in onCreateView() function;

+0

感謝男人......它幫助了! – krisDrOid

+1

這是不好的做法。他們添加了這種模式,這樣人們就不會在UI線程上編寫與網絡相關的東西。這是一個解決方法只比黑客高1個步驟。正確的代碼是更好的解決方案。 – WORMSS

相關問題