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.
¿Mi código está limpio o no está lanzado en el emulador?
¿Cómo se supone que debemos prepararnos para que esto suceda en producción?
¿Qué tal un período de gracia o algo así? ¿O ha pasado eso ahora ?-) ??
Con Honeycomb no puede realizar una operación de red en su hilo principal como lo indica la documentación. Por este motivo, debe usar handler o asynctask. No hay otra manera de hacerlo.
aquí puedes encontrar 2 ejemplos escritos en turco sobre la operación de red. tal vez ellos ayuden
3. party kütüphane kullanmadan (ksoap2) , (incluye traducción al inglés)
AsyncTask class''tan dönen parametreyi handle etmek. , traductor de google
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()
.