Как мне сохранить поток IntentService живым?
-
13-12-2019 - |
Вопрос
Я пишу тестовое приложение, которое отслеживает местоположение пользователей.Идея заключается в том, что я могу запустить службу, которая затем регистрируется для обновления местоположения.На данный момент я использую IntentService для этого.
Служебный код (который не работает...) выглядит следующим образом:
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;
}
}
В настоящее время единственное, что происходит, - это вывод "Going to sleep...".Мне нужен какой-то механизм, который поддерживает поток живым (потому что в противном случае прослушиватель больше недоступен для обновления статуса) и не тратит впустую процессорное время (я думаю, что цикл занятости - не самый предпочтительный способ).Даже если есть масса других способов реализовать поведение приложения (регистрация gps-координат) Я заинтересован в решении этого способа, чтобы изучить технику решения проблем такого рода!
Решение
Как мне сохранить поток IntentService живым?
Вы не.Вы не используете IntentService
в подобном сценарии.
Мне нужен какой-то механизм, который поддерживает поток в рабочем состоянии (потому что в противном случае прослушиватель больше недоступен для обновления статуса) и не тратит впустую процессорное время (я думаю, что цикл занятости не является предпочтительным способом)
Нет, в данном случае Service
это нормально, потому что вы контролируете, когда служба отключается, вы контролируете время жизни любых создаваемых вами потоков и т.д. IntentService
не подходит для вашей цели по назначению, потому что оно контролирует, когда служба прекращается, и оно управляет временем жизни потоков.
Другие советы
Рассмотреть возможность использования Удаленный сервис .Это сработало для меня.