Android LocationManager в AsyncTask - PullRequest
0 голосов
/ 07 мая 2011

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

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

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

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

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

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

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

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

1 Ответ

0 голосов
/ 08 мая 2011

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

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

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

...