Запрашивая у IntentService информацию о своей очереди - PullRequest
9 голосов
/ 18 марта 2011

У меня есть IntentService, который ставит в очередь вызовы веб-службы, которые необходимо выполнить на моем веб-сервере.Таким образом, каждый Intent - это вызов веб-службы.

Я хотел бы настроить что-то, где мое приложение может запросить этот IntentService, если у него есть какие-либо Intent, содержащие определенный фрагмент данных (IE: «ВыВы уже ждете, чтобы запросить у облака данные x? Или я должен сказать вам, чтобы вы это сделали?Можно ли пройти очередь IntentService IntentService?Или мне нужно взять код IntentService и изменить его?

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

Ответы [ 2 ]

21 голосов
/ 18 марта 2011

Есть ли какие-либо предложения о том, как я могу расширить IntentService для этого?Можно ли пройти очередь IntentService IntentService?Или мне нужно взять код IntentService и изменить его?

Вероятно, последний, если вы действительно хотите изучить реальную очередь.IntentService превращает Intents в сообщения, выдаваемые в очередь сообщений Looper через HandlerThread.Ничего из этого не раскрывается через SDK, хотя.К счастью, IntentService довольно короткий - даже не 150 строк.Вы можете клонировать его в свой собственный пакет и вносить изменения по мере необходимости.Просто запустите diff для источника, когда новые обновления источника будут выпущены в репозитории AOSP, чтобы вы знали, выполнила ли Google какую-либо серьезную операцию над IntentService, над которой вы, возможно, захотите воспользоваться.

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

Это даже не потребуетбыть постоянным, так как собственная очередь IntentService не является постоянной.Просто сохраните свою собственную очередь FIFO в onStartCommand(), связав ее с суперклассом, и вытолкнув вашу Intent из очереди в конце onHandleIntent().Это может привести к потере синхронизации с главной очередью (например, вы захотите использовать finally, чтобы убедиться, что вы удалили работу из собственной очереди), но вам не придется клонировать класс.

1 голос
/ 27 октября 2011

Другим решением может быть решение проблемы путем переопределения onStartCommand.

Здесь - это плавное решение, в котором я нашел вдохновение для подобной проблемы:)

...