Pregunta

Estoy luchando con este Looper en Android.Tengo un temporizador que funciona cada minuto.Esto envía un mensaje al servidor con la ubicación del usuario.

private Looper looper;    
public boolean getLocation(Context context, LocationResult result) {
        locationResult = result;
        lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

        //exceptions will be thrown if provider is not permitted.
        try {
            gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
        } catch (Exception ex) {
        }

        // don't start listeners if no provider is enabled
        if (!gps_enabled)
            return false;

        if(Looper.myLooper() == null)
            Looper.myLooper().prepare();

        looper = Looper.myLooper();
            lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListenerGps);

        looper.loop();
        return true;
    }

    LocationListener locationListenerGps = new LocationListener() {
        public void onLocationChanged(Location location) {
            looper.quit();
            lm.removeUpdates(this);

            locationResult.gotLocation(location); // broadcast location
        }

        public void onProviderDisabled(String provider) {
        }

        public void onProviderEnabled(String provider) {
        }

        public void onStatusChanged(String provider, int status, Bundle extras) {
        }
    };

La primera vez que se activa el temporizador, todo funciona a la perfección.La segunda vez, el temporizador se congela y el ícono de GPS en el teléfono dice que tiene un candado pero no desaparece.Es como si el Looper no estuviera en bucle para manejar los mensajes la segunda vez, aunque yo le dijera que lo haga.Si llamo a Looper.prepare () cada vez, la segunda vez que se ejecuta el temporizador obtengo la excepción que dice solo un Looper por hilo.

¡Seguramente esto no debería ser tan difícil!

¿Fue útil?

Solución

No es la mejor manera, pero cuando el temporizador se activa, crea un nuevo hilo en el que obtener la ubicación actual y luego enviar esa información al servidor.De esta manera, cada hilo tendrá su propio Looper que soluciona mi problema.Como dije, no es el mejor, pero el temporizador tiene otro trabajo que hacer.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top