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