Frage

Ich habe Probleme mit diesem Looper in Android.Ich habe einen Timer, der jede Minute läuft.Dadurch wird eine Nachricht mit dem Standort des Benutzers an den Server gesendet.

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) {
        }
    };

Wenn der Timer zum ersten Mal ausgelöst wird, funktioniert alles einwandfrei.Beim zweiten Mal friert der Timer ein und das GPS-Symbol auf dem Telefon zeigt an, dass es eine Sperre hat, aber nicht verschwindet.Es ist, als würde der Looper beim zweiten Mal keine Schleife ausführen, um die Nachrichten zu verarbeiten, obwohl ich ihm sage, dass er eine Schleife ausführen soll.Wenn ich Looper.prepare () jedes Mal aufrufe, erhalte ich beim zweiten Ausführen des Timers die Ausnahme, dass nur ein Looper pro Thread angezeigt wird.

Das sollte doch nicht so schwer sein!

War es hilfreich?

Lösung

Nicht der beste Weg, aber wenn der Timer tickt, wird ein neuer Thread erstellt, in dem der aktuelle Speicherort abgerufen und diese Informationen an den Server gesendet werden.Auf diese Weise erhält jeder Thread seinen eigenen Looper, der mein Problem behebt.Wie gesagt, nicht das Beste, aber der Timer hat andere Aufgaben zu erledigen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top