studio networkonmainthreadexception error android networking asynchronous android-asynctask networkonmainthread

android - error - NetworkOnMainThreadException



android.os.networkonmainthreadexception retrofit (5)

Me acabo de NetworkOnMainThreadException sobre NetworkOnMainThreadException en documentos oficiales

y me preguntaba si el emulador está lanzando esto. He estado probando mi aplicación bastante y, por lo que sé, todas las redes están fuera del hilo principal (usando Roboguice RoboAsyncTask) pero nunca se sabe si no se ha escapado.

También estoy usando StrictMode y no he visto nada.

  1. ¿Mi código está limpio o no está lanzado en el emulador?

  2. ¿Cómo se supone que debemos prepararnos para que esto suceda en producción?

  3. ¿Qué tal un período de gracia o algo así? ¿O ha pasado eso ahora ?-) ??



Desde Honeycomb SDK (3), Google ya no permitirá solicitudes de red (HTTP, Socket) y otras operaciones relacionadas directamente en la clase principal de subprocesos, de hecho, no debería hacer operaciones de red directas en el subproceso de interfaz de usuario, bloquear la interfaz de usuario, la experiencia del usuario es ¡malo! Incluso si Google no está prohibido, en circunstancias normales, ¡no lo haremos ~! Entonces, es decir, en la versión Honeycomb SDK (3), también puede continuar haciéndolo en Main Thread, más de 3, no funcionará.

1.use Handler

Las operaciones más lentas asociadas con la red se colocan en un hilo secundario y luego se comunican con el hilo principal utilizando el mecanismo de mensajería Handler

public static final String TAG = "NetWorkException"; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(R.layout.activity_net_work_exception); // Opens a child thread, performs network operations, waits for a return result, and uses handler to notify UI new Thread(networkTask).start(); } Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); // get data from msg and notify UI Bundle data = msg.getData(); String val = data.getString("data"); Log.i(TAG, "the result-->" + val); } }; /** * net work task */ Runnable networkTask = new Runnable() { @Override public void run() { // do here, the HTTP request. network requests related operations Message msg = new Message(); Bundle data = new Bundle(); data.putString("data", "request"); msg.setData(data); handler.sendMessage(msg); } };

2.use AsyncTask

public static final String TAG = "NetWorkException"; private ImageView mImageView; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(R.layout.activity_net_work_exception); mImageView = findViewById(R.id.image_view); new DownImage(mImageView).execute(); } class DownImage extends AsyncTask<String, Integer, Bitmap> { private ImageView imageView; public DownImage(ImageView imageView) { this.imageView = imageView; } @Override protected Bitmap doInBackground(String... params) { String url = params[0]; Bitmap bitmap = null; try { //load image from internet , http request here InputStream is = new URL(url).openStream(); bitmap = BitmapFactory.decodeStream(is); } catch (Exception e) { e.printStackTrace(); } return bitmap; } @Override protected void onPostExecute(Bitmap result) { // nodify UI here imageView.setImageBitmap(result); } }

3.use StrictMode

if (android.os.Build.VERSION.SDK_INT > 9) { StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); }


He probado esto y, de hecho, también ocurre en el emulador. Es mejor que te asegures de probar tu aplicación al menos en el emulador si piensas obtenerla en las tabletas de 3.0 y más allá.


Si está ejecutando en 3.0, no puedo ayudarlo; Porque el modo estricto está activado por defecto en él; Pero su tat anterior, entonces esto podría ayudar

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy);

Incluya esto antes de su creación de conexión HTTP; Entonces funciona


NetworkOnMainThreadException produce cuando algunas operaciones de red se realizan dentro del método principal; Me refiero a Oncreate() . Puede usar AsyncTask para resolver este problema. o puedes usar

StrictMode.ThreadPolicy mypolicy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy);

dentro del método onCreate() .