Creé una clase que ampliaba el Subproceso para recuperar la ubicación del usuario a través de LocationManager en un subproceso que no es de la interfaz de usuario. Implementé esto como un hilo porque se debe iniciar a pedido y hacer su trabajo solo por un tiempo limitado. Por cierto, tuve que agregar un objeto Looper en el hilo, para poder crear el controlador para el LocationManager (onLocationChanged).Cómo administrar Loopers y Subprocesos (¡el hilo ya no se muere!)
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
}
//...}
Me gustaría que el hilo para iniciar, recibir los datos de localización del usuario (en este caso sólo una vez), envía los datos al hilo principal a través de un mensaje a la controlador, y luego muere. El problema es que en mi caso el hilo ya no muere, una vez que finaliza el método de ejecución (eso 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 suspender de la hebra están en desuso, ¿cuál sería una buena forma, en este caso al menos, para hacer que un hilo con un looper muera?
Gracias de antemano;)
En mi caso, "manejador" es un objeto Handler pasado a este hilo desde el hilo de llamada, para ser utilizado para pasar los datos recopilados de uno a otro. Por lo tanto, no puedo llamar a handler.getLooper(). Quit() porque se refiere al hilo de actividad, y no al userLocationThread. Tenga en cuenta que onLocationChanged está dentro del nuevo hilo, y que Looper debe permitir que se llame a este método de devolución de llamada cuando el locationManager recibe una ubicación. –
He actualizado la respuesta para reflejar su caso. – inazaruk
Gracias; eso hace el trabajo. Por cierto, ¿cuál es la diferencia entre handler.getLooper(). Quit() y Looper.myLooper(). Quit()? ¡Pensé que funcionan igual! –