Как сохранить поток IntentService живым?

Я пишу тестовое приложение, которое отслеживает местоположение пользователей. Идея состоит в том, что я могу запустить службу, которая затем регистрируется для обновления местоположения. На данный момент я использую для этого 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;
}

}

В настоящее время единственное, что происходит, это вывод "Иду спать...". Мне нужен какой-то механизм, который поддерживает поток (потому что в противном случае слушатель больше недоступен для обновлений статуса) и не тратит время процессора (я думаю, что цикл занятости не является предпочтительным способом). Даже если есть масса других способов реализации поведения приложения (регистрация GPS-координат), меня интересует решение этого способа, чтобы изучить технику решения проблем такого рода!


person fliX    schedule 28.07.2012    source источник
comment
Почему бы вам не использовать Service вместо IntentService   -  person AAnkit    schedule 28.07.2012


Ответы (2)


Как сохранить поток IntentService живым?

Вы не знаете. Вы не используете IntentService в подобном сценарии.

Мне нужен какой-то механизм, который поддерживает поток (потому что в противном случае прослушиватель больше недоступен для обновлений статуса) и не тратит впустую время процессора (я думаю, что цикл занятости не является предпочтительным способом)

Нет, в данном случае Service подходит, потому что вы контролируете, когда служба уходит, вы контролируете время жизни любых потоков, которые вы создаете, и т. д. IntentService не подходит для вашей предполагаемой цели, потому что он контролирует когда служба уходит и она контролирует время жизни потоков.

person CommonsWare    schedule 28.07.2012
comment
Вы можете сказать, что IntentService хорош для синхронной фоновой обработки, но вам нужно будет использовать службу или что-то еще для асинхронной обработки. То есть, если вещь, которую вы вызываете, имеет обратный вызов, не используйте IntentService. - person lilbyrdie; 17.04.2013
comment
поэтому, если бы он хотел поместить цикл в свой IntentService, это было бы плохой практикой @CommonsWare? Ясно, значит, мы должны создать Service only вместо IntentService, верно? :D - person gumuruh; 13.07.2014
comment
@gumuruh: так что, если бы он хотел поместить цикл в свой IntentService, это было бы плохой практикой - ИМХО, да. Используйте обычный Service с собственным фоновым потоком, где вы можете определить свои собственные правила, когда служба закрывается, что делать, если команда получена, когда поток уже запущен, и т. д. - person CommonsWare; 13.07.2014
comment
Я вижу, я вижу. Но какая разница, если я использую общий поток и привязан к обработчику @CommonsWare? - person gumuruh; 14.07.2014
comment
@CommonsWare, каков ваш процент использования IntentService по сравнению с сервисом в общем количестве проектов, которые вы сделали? Пользуетесь ли Вы в большинстве случаев Сервисом? Это 20/80? - person deadfish; 25.01.2017
comment
@deadfish: Если сравнивать IntentService и Service, то подавляющее большинство - IntentService. - person CommonsWare; 25.01.2017

Попробуйте использовать удаленный сервис. Это сработало для меня.

person Anh3Saigon    schedule 28.07.2012
comment
Я считаю, что удаленные службы работают в отдельном процессе, а не в потоке. Я протестировал его, используя вызов Thread.sleep в Handler удаленной службы, и все приложение зависло, пока служба спала. - person woojoo666; 02.07.2014