2011-09-13 31 views
8

Tôi nhận thấy rằng lỗi này xảy ra khi bạn cố gắng thực hiện một số yêu cầu mạng trên chuỗi giao diện người dùng, nhưng như bạn có thể thấy trong mã bên dưới, tôi thực sự gọi Http Get trong AsyncTask :android.os.NetworkOnMainThreadException trong 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); 
     } 
    } 
} 

Có ai có thể thấy bất kỳ vấn đề rõ ràng nào ở đây không? Ngoài ra, ngoại lệ NetworkOnMainThreadException có thể bị ném vì bất kỳ lý do nào khác ngoài việc thực hiện yêu cầu http trong chuỗi chính không?

Tôi là người mới đến Android, chỉ làm việc với nó một vài ngày.

Trả lời

22

nhưng khi bạn có thể thấy trong đoạn code dưới đây tôi đang thực sự gọi Http Nhận trong một AsyncTask

Bạn không phải là, trên thực tế. Bạn cần gọi số execute() thay vì gọi trực tiếp doInBackground(), nếu không bạn không sử dụng bất kỳ hệ thống ống nước nào được cung cấp bởi AsyncTask và bạn chỉ cần gọi phương thức trực tiếp trong chuỗi giao diện người dùng.

+0

Aha cảm ơn bạn của tôi! – jcvandan

+0

Tôi đã vấp phải điều này nhiều lần, và đã gần gũi với nó nhiều lần hơn với các chủ đề (Bắt đầu và chạy). Tại sao 'doInBackground()' thậm chí có sẵn khi nó vô ích này? –

+1

Uh ... ý của bạn là "có sẵn"? Trước hết, nó được 'bảo vệ', có nghĩa là bạn không được gọi nó từ một lớp bên ngoài AsyncTask. Thật không may, nhiều người chỉ khai báo nội tuyến AsyncTasks để họ có thể (và thực hiện) gọi 'doInBackground()'. 'execute()' tuy nhiên, * là * 'public'. – dmon

1

Có thể phiên bản SDK Android cao (phiên bản> = 3.0).

Hãy thử thêm mã

nhập android.os.StrictMode;

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

trong chức năng onCreateView();

+0

Cảm ơn người đàn ông ... nó đã giúp !!!! – krisDrOid

+1

Đây là thực hành không tốt. Họ đã thêm chế độ này để mọi người sẽ không mã hóa nội dung liên quan đến mạng trên Giao diện người dùng. Đó là một Workaround chỉ cao hơn 1 bước so với hack. Mã đúng cách là giải pháp tốt hơn. – WORMSS

Các vấn đề liên quan