Android: как правильно ждать завершения процесса обслуживания

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

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

Что будет «правильным» способом надлежащего ожидания (может быть, даже с обновлением статуса) в этом случае?

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

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

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

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

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

    Что будет «правильным» способом надлежащего ожидания (может быть, даже с обновлением статуса) в этом случае?

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

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

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