Android: как правильно ждать завершения процесса обслуживания - PullRequest
4 голосов
/ 18 февраля 2010

Вот сценарий:

  1. У меня есть 2 вида деятельности и один сервис
  2. Первое действие - просмотр / поиск страницы приземления. Второе действие отображает результаты поиска
  3. Поиск всегда выполняется по внутренней базе данных SQLite
  4. Периодически (скажем, ежедневно) необходимо обновлять дБ из удаленного источника, что является длительным процессом
  5. Если пользователь выполняет поиск во время обновления, я хочу подождать, пока обновление не закончится, пока отображается предупреждение о прогрессе «Пожалуйста, подождите». Я не хочу запрашивать и отображать результаты поиска, пока обновление не будет полностью выполнено.
  6. Обновление БД запускается AlarmManager и выполняется службой, которая переводит состояние «ОБНОВЛЕНИЕ» в БД во время обновления
  7. Я могу легко запросить статус, но как мне ждать и периодически повторно запрашивать базу данных? Я использую AsyncTask для обработки результатов поиска, и моей реакцией на колени было поместить цикл с wait () в метод AsyncTask#doInBackground, но это опасно и просто не работает, поскольку я не контролирую поток пользовательского интерфейса, поэтому я заканчиваю с IllegalMonitorStateException.

Каким будет «правильный» способ правильно ждать (может быть, даже с обновлением статуса) в этом случае?

P.S. Я поместил код "ожидания" в Runnable и выполнил его еще до того, как доберусь до своей AsyncTask. Это работает, например. Thread.sleep(2000) все же я не уверен, что это способ сделать это безопасно. У кого-нибудь есть опыт работы с FutureTask?

Ответы [ 2 ]

2 голосов
/ 18 февраля 2010

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

Это ваш призыв, но имейте в виду, что вы создаете свою собственную проблему. Лично я бы снял это требование. Пользователь не должен испытывать неудобства только потому, что сработала сигнализация.

Например, вы можете отключить будильник и включить его снова, когда активность исчезнет.

Или, чтобы обновление было выполнено так, чтобы оно было атомарным (например, сделайте обновление для копии таблицы, а затем синхронизируйте таблицы в транзакции), чтобы действие все еще могло безопасно обращаться к базе данных во время обновления.

Каким был бы «правильный» способ правильно ждать (может быть даже со статусом обновление) в этом случае?

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

0 голосов
/ 18 февраля 2010

Спасибо Марку (как всегда) за полезные идеи. Здесь я собираюсь обрисовать, как (по моему мнению) вышеупомянутый сценарий должен быть сделан:

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