2011-09-13 17 views
8

UI iş parçacığı üzerinde bir tür ağ isteği yapmaya çalıştığınızda bu hatanın gerçekleştiğini fark ediyorum, ancak aşağıdaki kodda gördüğünüz gibi aslında Http Get'i bir AsyncTask'ta arıyorum :android.os.NetworkOnMainThreadException 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); 
     } 
    } 
} 

Burada herhangi bir bariz sorun görülebilir mi? Ayrıca, ana iş parçacığında bir http isteği yapmaktan başka bir nedenle NetworkOnMainThreadException istisnası atılabilir mi?

Android için yeni bir kullanıcıyım, sadece birkaç gün çalışıyorum.

cevap

22

ama aslında gerçekte, bir AsyncTask

Değilsin içinde Http alın arıyorum Aşağıdaki kodda görebileceğiniz gibi. Doğrudan doInBackground()'u çağırmak yerine execute()'u aramanız gerekir, aksi halde AsyncTask tarafından sağlanan tesisattan herhangi birini kullanmıyorsunuz demektir ve yöntemi doğrudan UI iş parçacığında çağırıyorsunuz.

+0

Aha teşekkür ederim arkadaşım! – jcvandan

+0

Birkaç kez bunu aştım ve iş parçacığı ile birkaç kez daha yapmaya başladım (Start vs run). Bu işe yaramazsa, neden 'doInBackground()' niçin kullanılabilir? –

+1

Uh ... "uygun" derken ne demek istiyorsun? Her şeyden önce, 'korumalı', yani AsyncTask'ın dışındaki bir sınıftan çağırmanız gerekmiyor. Ne yazık ki, pek çok kişi AsyncTasks'i satır içi olarak ilan ediyorlar, böylece doInBackground() işlevini çağırıyorlar. execute() 'ancak * * publicdir. – dmon

1

Belki de Android SDK sürümü yüksektir (sürüm> = 3.0).

deneyin kodunu

ithalat android.os.StrictMode eklemek için; onCreateView() işlevi;

+0

Teşekkürler adam ... yardımcı oldu !! – krisDrOid

+1

Bu kötü bir uygulamadır. Bu modu eklediler, böylece kullanıcılar UI Thread'deki ağla ilgili materyalleri kodlamayacaklardı. Bu bir Hack'den sadece 1 adım daha yüksek bir çözümdür. Kod doğru bir şekilde daha iyi bir çözümdür. – WORMSS