Question

J'écris une application de test qui garde une trace de l'emplacement des utilisateurs.L'idée est que je peux démarrer un service qui s'enregistre ensuite pour les mises à jour de localisation.Pour l'instant, j'utilise un IntentService pour cela.

Le code du service (qui ne fonctionne pas...) ressemble à ça :

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

}

Actuellement, la seule chose qui se produit est la sortie "Je vais dormir...".J'ai besoin d'un mécanisme qui maintient le thread en vie (car sinon l'écouteur n'est plus accessible pour les mises à jour de statut) et ne perd pas de temps CPU (je pense que la boucle occupée n'est pas la méthode préférée).Même s'il existe des tonnes d'autres façons de réaliser le comportement de l'application (enregistrement des coordonnées GPS), je suis intéressé par une solution à cette manière pour apprendre une technique permettant de résoudre des problèmes de cette nature !

Était-ce utile?

La solution

Comment garder le fil d'un IntentService en vie ?

Ce n'est pas le cas.Vous n'utilisez pas IntentService dans un scénario comme celui-ci.

J'ai besoin d'un mécanisme qui maintient le thread en vie (sinon, l'écouteur n'est plus accessible pour les mises à jour de statut) et ne perd pas de temps CPU (je pense que la boucle occupée n'est pas la méthode préférée)

Non, dans ce cas, un Service c'est bien, car vous contrôlez le moment où le service disparaît, vous contrôlez la durée de vie de tous les threads que vous créez, etc. IntentService n'est pas adapté à l'usage auquel vous êtes destiné, car il contrôle quand le service disparaît et il contrôle la durée de vie des threads.

Autres conseils

envisagez d'utiliser un Service à distance .Cela a fonctionné pour moi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top