Вот сценарий:Android: как правильно ждать завершения процесса обслуживания
- У меня 2 мероприятия и одну услуги
- Первая деятельность представляет собой вид посадки/страница поиска. Во-вторых активность отображает результаты поиска
- Поиск всегда выполняется с внутренней БД SQLite
- Периодически (например ежедневно) дб необходимо обновить из удаленного источника, который является длительным процессом
- Если пользователь выполняет поиск в процессе обновления I хотите дождаться завершения обновления при отображении предупреждения «Подождите». Я не хочу запрашивать и отображать результаты поиска, пока обновление не будет полностью завершено.
- Обновление db запускается AlarmManager и выполняется службой, которая ставит статус «ОБНОВЛЕНИЕ» в db во время обновления.
- Я могу легко запросить статус, но как подождать и периодически повторно запрашивать базу данных? Я использую AsyncTask для обработки результатов поиска, и моя реакция коленного рефлекса заключалась в том, чтобы поместить цикл с wait() в метод
AsyncTask#doInBackground
, но это опасно и просто не работает, так как я не контролирую поток пользовательского интерфейса, поэтому в итогеIllegalMonitorStateException
.
Что будет «правильным» способом надлежащего ожидания (может быть, даже с обновлением статуса) в этом случае?
P.S. Я поместил код ожидания в Runnable и выполнил его еще до того, как я доберусь до своей AsyncTask. Он работает, например. Thread.sleep(2000)
все еще я не уверен, что это способ сделать это безопасно. Есть ли у кого-нибудь опыт работы с FutureTask
?
Я думал по тем же линиям. Я не могу отложить обновление, так как пользователь может начать работу, пока обновление уже выполняется. Таким образом, я сделаю флип (это другой вопрос), который подает пользовательские данные до тех пор, пока обновление не будет выполнено. Однако есть две проблемы, которые остаются: 1. Как насчет первоначального обновления после того, как пользователь впервые установил приложение? В этот момент нет ничего, что можно было бы перевернуть, поскольку у меня нет старых данных. 2. Я предоставляю пользователю возможность принудительно обновить. В этот момент мне нужно показать пользователю, что обновление выполняется. – Bostone
«Нет ничего, чтобы перевернуть в этот момент, так как у меня пока нет старых данных» :: shrug: см., Если таблица пуста, и пропустите флип или что-то еще , «В этот момент мне нужно показать пользователю, что обновление выполняется» - используйте технику в последнем абзаце моего ответа. Проблема синхронизации отпадает (я думаю), потому что пользователь инициирует обновление. – CommonsWare
Пропустить флип очевидно ... На самом деле я просто придумал, что вместо того, чтобы заставить пользователя ждать, глядя на диалог прогресса, я могу постепенно добавлять в ListView (пока отображается индикатор обновления внизу). Служба может сообщать обновления обратно в представление – Bostone