Comment garder le fil d'un IntentService en vie ?
-
13-12-2019 - |
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 !
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.