2011-09-13 14 views
8

Me doy cuenta de que este error ocurre cuando intentas hacer algún tipo de solicitud de red en el hilo de UI, pero como puedes ver en el siguiente código, en realidad estoy llamando al Http Get en AsyncTask :android.os.NetworkOnMainThreadException en 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); 
     } 
    } 
} 

¿Alguien puede ver algún problema obvio aquí? ¿También se puede lanzar la excepción NetworkOnMainThreadException por cualquier otra razón que no sea hacer una solicitud http en el hilo principal?

Soy un recién llegado a Android, solo he estado trabajando con él unos días.

Respuesta

22

pero como se puede ver en el siguiente código en realidad estoy llamando a la Http Get en un AsyncTask

Usted no es, en realidad. Debe llamar al execute() en lugar de llamar al doInBackground() directamente; de ​​lo contrario, no está utilizando ninguna de las tuberías provistas por el AsyncTask, y solo llama al método directamente en el hilo de la interfaz de usuario.

+0

¡Gracias, amigo! – jcvandan

+0

He tropezado con esto varias veces, y he estado cerca de hacerlo varias veces más con subprocesos (Inicio vs. Ejecutar). ¿Por qué 'doInBackground()' está disponible cuando es inútil? –

+1

Uh ... ¿qué quiere decir "disponible"? En primer lugar, está 'protegido', lo que significa que no debes llamarlo desde una clase fuera de AsyncTask. Desafortunadamente, muchas personas simplemente declaran las AsyncTasks en línea para que puedan (y lo hagan) llamar a 'doInBackground()'. 'execute()' sin embargo, * es * 'público'. – dmon

1

Tal vez la versión de Android SDK es demasiado alta (versión> = 3.0).

intenta agregar código

android.os.StrictMode importación;

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

en onCreateView() function;

+0

Gracias, hombre ... ¡Ayudó! – krisDrOid

+1

Esta es una mala práctica. Agregaron este modo para que la gente no codifique cosas relacionadas con la red en el subproceso UI. Es una solución alternativa solo 1 paso más alta que un truco. Código correctamente es la mejor solución. – WORMSS