Android HandlerThread перестает работать, когда устройство отключено от USB-кабеля

#android #multithreading #service #usb #location

#Android #многопоточность #Обслуживание #usb #Расположение

Вопрос:

Мое приложение включает в себя службу, которая порождает HandlerThread, которая периодически запрашивает обновление местоположения у LocationManager. Каждый раз, когда я получаю обновленное местоположение, я отключаю обновления местоположения и отправляю отправителю отложенное сообщение, которое снова запустит обновления в будущем:

 public class VMLocator extends HandlerThread implements LocationListener {

 ...

private final class VMHandler extends Handler
{
    public VMHandler(Looper looper)
    {
        super(looper);
    }

    @Override
    public void handleMessage(Message msg) 
    {
        if(MSG_START_LOCATION_UPDATES == msg.what)
        {
            startLocationUpdates();
        }
    }

}

...

@Override
public void onLocationChanged(Location location) {
    ...
    stopLocationUpdates();
    // Schedule updates to start again in the future.
    Message msg = new Message();
    msg.what = MSG_START_LOCATION_UPDATES;
    handler.sendMessageDelayed(msg, 5000);   // <-- Testing value. Will be much larger.
    ...
}
  

В настоящее время я тестирую телефон HTC Desire S под управлением 2.3.3, разрабатываемый с помощью Eclipse. Все работает нормально, пока телефон подключен через USB-кабель к моей машине разработки. Однако:

  • Если я запускаю приложение из Eclipse (либо для отладки, либо для запуска), все работает нормально, пока я не отключу USB-кабель, после чего мой HandlerThread, похоже, останавливается.
  • Если я запускаю приложение с самого телефона, после отсоединения USB-кабеля служба запускается, но поток, похоже, не запущен.

Что следует отметить:

  • В любом из приведенных выше случаев, если я снова подключу USB-кабель, он сразу же снова начнет работать.
  • В любом из приведенных выше случаев Настройки -> Приложения -> Запущенные службы всегда указывают, что моя служба все еще запущена.
  • Я добавил несколько отладочных тостов; насколько я могу судить, моя служба не уничтожается, но очередь сообщений HandlerThread перестает обрабатывать сообщения.

Я пробовал запускать с телефона при отключении и отключении отладки по USB с тем же результатом. Я чувствую, что в документах, которые я пропустил, есть что-то простое, потому что я думал, что при запуске / отладке из Eclipse установлено приложение, и приложение должно нормально функционировать независимо от того, подключен USB-кабель или нет.

Комментарии:

1. Как вы точно знаете, что ваш поток останавливается /, похоже, не запущен? Каков конечный результат его работы?

2. Каждый раз, когда вызывается onLocationChanged() или handleMessage(), я показываю тост. Тосты больше не отображаются, как только я отсоединяю USB-кабель, и возобновляются, как только я снова подключаю его.

3. Это может быть проблемой Toasts , которая по какой-то причине не отображается, а не приостановлена служба. Попробуйте добавить Log.d() вызовы в свой код и использовать приложение, aLogcat чтобы увидеть их на работающем устройстве.

Ответ №1:

Спасибо dragonroot, ваше предложение помогло мне понять, в чем проблема.

Проблема заключалась в том, что у меня был вызов Debug.waitForDebugger(); в HandlerThread. Как только USB-кабель отсоединяется, этот вызов останавливается навсегда, поскольку соединение с отладчиком не найдено.

Очень простая ошибка в ретроспективе, надеюсь, это поможет кому-то еще избежать этого.