Frage

Ich schreibe eine Testanwendung, die den Standort des Benutzers verfolgt.Die Idee ist, dass ich einen Dienst starten kann, der sich dann für Standortaktualisierungen registriert.Im Moment verwende ich dafür einen IntentService.

Der Servicecode (der nicht funktioniert...) sieht folgendermaßen aus:

public class GpsGatheringService extends IntentService {

// vars
private static final String TAG = "GpsGatheringService";
private boolean stopThread;

// constructors
public GpsGatheringService() {
    super("GpsGatheringServiceThread");
    stopThread = false;
}

// methods
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.d(TAG, "onStartCommand()");
    return super.onStartCommand(intent, flags, startId);
}

@Override
protected void onHandleIntent(Intent arg0) {
    // this is running in a dedicated thread
    Log.d(TAG, "onHandleIntent()");
    LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
    LocationListener locationListener = new LocationListener() {

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            Log.d(TAG, "onStatusChanged()");
        }

        @Override
        public void onProviderEnabled(String provider) {
            Log.d(TAG, "onProviderEnabled()");
        }

        @Override
        public void onProviderDisabled(String provider) {
            Log.d(TAG, "onProviderDisabled()");
        }

        @Override
        public void onLocationChanged(Location location) {
            Log.d(TAG, "onLocationChanged()");
        }
    };
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);

    while (!stopThread) {
        try {
            Log.d(TAG, "Going to sleep...");
            Thread.sleep(1500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

@Override
public void onDestroy() {
    super.onDestroy();
    Log.d(TAG, "onDestroy()");
    stopThread = true;
}

}

Derzeit passiert nur die Ausgabe „Geh schlafen…“.Ich brauche einen Mechanismus, der den Thread am Leben hält (da der Listener sonst nicht mehr für Statusaktualisierungen erreichbar ist) und keine CPU-Zeit verschwendet (ich denke, beschäftigte Schleifen sind nicht die bevorzugte Methode).Auch wenn es unzählige andere Möglichkeiten gibt, das Anwendungsverhalten zu realisieren (Aufzeichnung von GPS-Koordinaten), bin ich an einer Lösung für diese Möglichkeit interessiert, um eine Technik zur Lösung von Problemen dieser Art zu erlernen!

War es hilfreich?

Lösung

Wie halte ich den Thread eines IntentService am Leben?

Das tust du nicht.Sie nutzen es nicht IntentService in einem Szenario wie diesem.

Ich brauche einen Mechanismus, der den Thread am Leben hält (da der Listener sonst nicht mehr für Statusaktualisierungen erreichbar ist) und keine CPU-Zeit verschwendet (ich denke, beschäftigte Schleifen sind nicht die bevorzugte Methode).

Nein, in diesem Fall a Service ist in Ordnung, denn Sie steuern, wann der Dienst eingestellt wird, Sie steuern die Lebensdauer aller von Ihnen erstellten Threads usw. IntentService für Ihren beabsichtigten Zweck ungeeignet ist, weil Es steuert, wann der Dienst eingestellt wird und Es steuert die Lebensdauer der Threads.

Andere Tipps

Erwägen Sie die Verwendung eines Remote Service .Es hat für mich gearbeitet.

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