Cómo administrar Loopers y Threads (el hilo no muere más!)

Creé una clase que extiende Thread para recuperar la ubicación del usuario a través de LocationManager en un subproceso no-ui. He implementado esto como un hilo, ya que tiene que ser iniciado a petición y hacer su trabajo sólo por un tiempo limitado. Por cierto, tuve que añadir un objeto Looper en el hilo, para poder crear el controlador para el LocationManager (onLocationChanged).

Este es el código:

public class UserLocationThread extends Thread implements LocationListener { //... public void run() { try { Looper.prepare(); locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this); Looper.loop(); Looper.myLooper().quit(); } catch (Exception e) { //... } } @Override public void onLocationChanged(Location location) { locationManager.removeUpdates(this); //... handler.sendMessage(msg); //this is the handler for communication with father thread } //...} 

Quisiera que el hilo comenzara, recibiera los datos de la localización del usuario (en este caso apenas una vez), enviaría los datos al hilo principal vía un mensaje al encargado, y moriría entonces. El problema es que en mi caso el hilo no muere más, una vez que el método run terminó (que debería estar bien, porque de lo contrario onLocationChanged no recibiría las nuevas ubicaciones).

Pero de esta manera, suponiendo que los métodos stop y suspend de thread están obsoletos, ¿cuál sería una buena manera, en este caso al menos, de hacer un thread con un looper die?

Gracias por adelantado 😉

Puede salir explícitamente del bucle Looper con el Handler :

 private Handler mUserLocationHandler = null; private Handler handler = null; public class UserLocationThread extends Thread implements LocationListener { public void run() { try { Looper.prepare(); mUserLocationHandler = new Handler(); locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this); Looper.loop(); } catch (Exception e) { //... } } @Override public void onLocationChanged(Location location) { locationManager.removeUpdates(this); //... handler.sendMessage(msg); if(mUserLocationHandler != null){ mUserLocationHandler.getLooper().quit(); } } 

"He implementado esto como una pisada porque tiene que ser iniciado a petición y hacer su trabajo sólo por un tiempo limitado."

Esto suena como una razón perfecta para simplemente reutilizar el looper principal. No hay necesidad de generar un nuevo hilo aquí. Si está haciendo bloqueo de trabajo (red de E / S, etc) en onLocationChanged (), en ese momento podría girar un ASyncTask.

Implementar LocationListener en su actividad / servicio o lo que sea y dejarlo usar el looper principal de forma predeterminada.

El desove de un nuevo hilo, estableciéndolo en bucle, y luego de inmediato dejar de fumar es innecesario.

IntentService es bueno para hacer este trabajo.

IntentService es una clase base para Servicios que manejan solicitudes asincrónicas (expresadas como Intentes) a petición. Los clientes envían solicitudes a través de llamadas startService (Intent); El servicio se inicia según sea necesario, maneja cada intento a su vez usando un hilo de trabajo y se detiene cuando se queda sin trabajo.

Looper().quit(); Es bueno, y según la especificación:

Hace que el método loop () termine sin procesar más mensajes en la cola de mensajes.

Pero, si tiene una tarea que ya está bajo proceso y desea detenerla también, puede adquirir hilo de trabajo y hacer que interrumpa:

 @Override public void onLocationChanged(Location location) { locationManager.removeUpdates(this); handler.sendMessage(msg); //this is the handler for communication with father thread if(mUserLocationHandler != null){ mUserLocationHandler.getLooper().quit(); mUserLocationHandler.getLooper().getThread().interrupt(); // <-- here } 

}

Esto funciona bien con la mayoría de IO, y el hilo de bloqueo / espera.

Extender la clase AsyncTask . Hace todo el roscado y la dirección para usted automáticamente.

  • ¿Se matará el hilo antes de que finalice la actividad en Android?
  • Bloqueo de hilo principal de Android que bloquea hilo de WebView
  • Cómo crear tostadas de IntentService? Se queda atascado en la pantalla
  • TarsosDSP y SurfaceView múltiple problema de subprocesamiento
  • Detención de un subproceso dentro de un servicio
  • ¿Cómo ejecutar el servicio no en el hilo principal?
  • Android: ¿Cuál es la forma más suave de sincronizar una base de datos remota en segundo plano?
  • Cargar anuncio (adMob) en el subproceso de fondo
  • Hilos y uso de tareas Asynctask para httppost
  • PARTIAL_WAKE_LOCK vs SCREEN_DIM_WAKE_LOCK en el subproceso de descarga
  • SDK de Android: ejecuta funciones en segundo plano
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.