Android LocationManager в AsyncTask

Во-первых, я знаю, что LocationManager не нужно вызывать в AsyncTask, поскольку он уже не блокирует пользовательский интерфейс :)

У меня есть действие, которое 1. Получает текущее местоположение пользователей. 2. Вызывает веб-сервис для получения списка конкретных POI вокруг этого местоположения.

Пользователь может выбрать просмотр результатов в виде карты или списка с помощью TabActivity. Принимая это во внимание, AsyncTask для получения местоположения пользователей и вызова веб-службы управляется представлением TabActivity, а не одним из закрепленных представлений.

Итак, я хочу, чтобы TabActivity запускал AsyncTask, который сначала получает местоположение пользователей, а затем вызывает веб-сервис. Диалоговое окно прогресса предотвращает переключение видов с помощью вкладок во время этого процесса.

Почти все работает, кроме получения местоположения пользователей из AsyncTask. Написан код веб-сервиса, написан код отображения и оверлея, диалог выполнения задачи справляется с изменением ориентации.

Основное внимание при определении местоположения уделяется скорости, а не точности. Если пользователь решит просмотреть результаты на карте, я предоставлю кнопку «Мое местоположение», которая позволит получить более точное местоположение. Я просто хочу сначала получить приблизительное местоположение и быстро вернуть результаты поиска.

Может быть, я иду об этом неправильно. Может быть, мне следует отобразить представление карты, позволить активности карты найти текущее местоположение, а затем вызвать только веб-службу в асинхронном режиме, но что, если пользователь коснется вкладки представления списка на этапе определения местоположения? Я также собирался позволить пользователю указать свой вид по умолчанию — некоторые люди могут предпочесть список карте. В этом случае у меня был бы список, который должен был получить местоположение.

Спасибо за любой совет Мартин.


person MartinS    schedule 07.05.2011    source источник


Ответы (1)


Я подозревал это. Проблема, с которой я столкнулся, заключалась в том, что LocationListener не вызывался в AsyncTask. Причина этого заключалась в том, что, хотя я создал и подготовил лопер в потоке, я не вызвал Looper.Loop()

Я запускаю requestLocationUpdates, запускаю таймер. Либо менеджер местоположения отвечает с местоположением, либо истекает срок действия таймера. В этот момент я вызываю looper.quit(), чтобы все вернулось в норму.

Кажется, работает. Вы также должны помнить, что нужно реагировать на кнопку «Назад» и т. д., отменяя таймер и цикл, если AsyncTask отменяется.

person MartinS    schedule 08.05.2011