Каков правильный поток управления для получения одноразового исправления местоположения пользователя (через GPS)? - PullRequest
2 голосов
/ 24 мая 2011

Я ищу "правильный" способ исправить положение пользователя как одноразовую задачу.На данный момент мой поток выполнения примерно равен:

  1. Пользователь нажимает кнопку.
  2. Обработчик (содержится в основном коде Activity ) регистрирует GPSслушатель местоположения с системой, настроенной на максимально быстрое обновление, запускает ASyncTask и завершает работу.
  3. Перед выполнением, ASyncTask эффективно генерирует ProgressDialogблокирование любого другого использования пользовательского интерфейса.
  4. Для выполнения фоновой задачи ASyncTask ожидает либо тайм-аут, либо определение местоположения для GPS.
  5. После выполнения ASyncTask либо отображает некоторые релевантные данные пользователю, если местоположение было найдено, либо отображает ошибку в тосте, если это не так.Это также отменяет регистрацию слушателя, конечно.

Теперь, пока это работает, есть множество минусов.Во-первых, и совершенно очевидно, что все другие взаимодействия пользовательского интерфейса с приложением блокируются во время выполнения запроса.В настоящее время это не так уж и плохо, так как основная функция приложения состоит в том, чтобы выполнять эту задачу, и во время работы делать больше нечего - это также не дает пользователю спамить кнопку.Кроме того, я не уверен, является ли фаза пост-выполнения ASyncTask действительно местом для размещения моей логики определения местоположения (она делает интернет-вызов, что само по себе может быть лучше в ASyncTask?).Тем не менее, я не уверен, как еще передать тот факт, что местоположение было найдено и что основной поток должен что-то сделать.

Я надеялся, что кто-то может сообщить мне о «правильном» путичтобы сделать это - то есть использует ASyncTask, как это правильно, должна ли быть задействована Служба, и как я должен иметь дело с пост-местоположением интернет-вызова), и, возможно, даже дать несколько мудрых слов о том, как в целом действоватьс потоком управления приложения, которое должно делать несколько «блокирующих» вызовов.

Я могу предоставить код при необходимости, может потребоваться немного времени, чтобы сократить его до минимального решения.

1 Ответ

1 голос
/ 24 мая 2011

Блокирование вызовов и блокирование пользовательского интерфейса, как правило, следует избегать. См. Reto Meier's взятие на тему .

Следовательно, я бы полностью сбросил AsyncTask. Отключите Button, который пользователь использует для запуска запроса на исправление. Используйте postDelayed() Runnable для вашего механизма тайм-аута. И позволить пользователю что-то делать (читать справку и т. Д.). Используйте индикатор прогресса в строке заголовка, чтобы указать, что вы работаете над получением местоположения, отключением индикатора при получении исправления или по истечении времени ожидания.

(он делает интернет-вызов, что само по себе может быть лучше в ASyncTask?)

Это, конечно, не должно быть сделано в главном потоке приложения. Когда появится определение местоположения, нажмите AsyncTask, чтобы получить данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...