2011-09-13 8 views
8

私は、UIスレッドで何らかの種類のネットワーク要求を実行しようとするとこのエラーが発生することを認識していますが、以下のコードでわかるように、実際にはHttpをAsyncTask :android.os.NetworkOnMainThreadException in AsyncTask

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

が、私は実際に実際に、AsyncTask

あなたがいないならでのHttp 取得を呼び出しています下のあなたは、コード内で見ることができるように。 doInBackground()を直接呼び出す代わりに​​に電話する必要があります。そうでなければ、AsyncTaskで提供されている配管を使用していないため、UIスレッドでメソッドを直接呼び出すだけです。

+0

ああ、ありがとう、私の友人! – jcvandan

+0

私はこれを何度も乗り越え、スレッドを使って何度もそれをやり遂げることに近づいています(開始vs.実行)。これが役に立たないときに 'doInBackground()'を利用できるのはなぜですか? –

+1

ええと...「利用可能」とはどういう意味ですか?まず第一に、それは 'protected'です。つまり、あなたはAsyncTaskの外のクラスからそれを呼び出すことは想定されていません。残念ながら、AsyncTasksをインラインで宣言するだけで、doInBackground()を呼び出すことができます。しかし、 'execute()'は* 'public'です。 – dmon

1

Android SDKのバージョンが高い(バージョン> 3.0)場合があります。コード

インポートandroid.os.StrictModeを追加する

てみてください。

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

onCreateView()機能;

+0

おかげで男...それは助け!!!! – krisDrOid

+1

これは悪いことです。彼らはこのモードを追加して、人々がUIスレッドでネットワーク関連のものをコード化しないようにしました。これは、ハックよりも1ステップ高いだけの回避策です。コードは正しく解決されます。 – WORMSS

関連する問題