Como mantenho o Thread de um IntentService ativo?
-
13-12-2019 - |
Pergunta
Estou escrevendo um aplicativo de teste que monitora a localização dos usuários.A ideia é que eu possa iniciar um serviço que então se registre para atualizações de localização.Por enquanto estou usando um IntentService para isso.
O código do serviço (que não está funcionando...) fica assim:
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;
}
}
Atualmente a única coisa que acontece é a saída de "Vou dormir...".Preciso de algum mecanismo que mantenha o thread ativo (porque senão o ouvinte não estará mais acessível para atualizações de status) e não desperdice tempo de CPU (acho que o loop ocupado não é a forma preferida).Mesmo que existam inúmeras outras formas de perceber o comportamento da aplicação (registo de coordenadas GPS) estou interessado numa solução para esta forma de aprender uma técnica para resolver problemas desta natureza!
Solução
Como mantenho o Thread de um IntentService ativo?
Você não.Você não usa IntentService
em um cenário como este.
Eu preciso de algum mecanismo que mantenha o thread ativo (porque senão o ouvinte não estará mais acessível para atualizações de status) e não desperdice tempo de CPU (acho que o loop ocupado não é o caminho preferido)
Não, neste caso um Service
está tudo bem, porque você controla quando o serviço será encerrado, você controla o tempo de vida de qualquer thread que criar, etc. IntentService
não é adequado para o fim a que se destina, porque isto controla quando o serviço está indo embora e isto controla o tempo de vida dos threads.
Outras dicas
Considere usar um serviço remoto.Funcionou para mim.