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.
¡Gracias, amigo! – jcvandan
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? –
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