Задержка создания IntentService - PullRequest
       12

Задержка создания IntentService

0 голосов
/ 22 февраля 2011

Мое приложение выполняет вызовы веб-службы из IntentService.Каждый Intent - это, по сути, вызов веб-службы, который должен выполняться.

Как известно, IntentService ставит в очередь Intents;поэтому в любой момент времени будет выполняться только один вызов веб-службы.Это на самом деле желаемое поведение.

Однако это представляет проблему.Предположим, мое приложение ставит в очередь 5 Intents в этом IntentService.Скажем, пользователь оказывается на экране, который, возможно, поддерживает пользовательский интерфейс, пока некоторые данные извлекаются из веб-службы.Если намерение для этого веб-сервиса будет помещено в конец очереди, это может занять много времени, прежде чем веб-сервис будет вызван, удерживая пользователя в течение недопустимого периода времени.

Так как я могу 'Чтобы внедрить Intents в начало очереди IntentService (насколько я знаю), я решил создать второй IntentService для вызовов, которые требуют немедленного выполнения.Так как я хочу, чтобы в каждый момент времени мой сервис срабатывал только на один вызов, я обернул мьютекс вокруг фактического Http-кода.Таким образом, в этом случае Intent будет выполняться сразу (потому что он находится в другом IntentService), но зацикливаться на мьютексе до тех пор, пока какой-либо вызов в другом IntentService не будет завершен.

Это хорошо работает для меня;Я в порядке со всем этим.

Вот мой вопрос:

Теоретически, новый IntentService тоже может стоять в очереди.Из-за рабочего процесса приложения это вряд ли произойдет, но теоретически возможно.Если это так, я бы хотел, чтобы новый IntentService завершил работу, прежде чем исходный IntentService возобновит работу.Моя идея сделать это - заблокировать / разблокировать новый мьютекс в методах создания и уничтожения нового IntentService.Тот же мьютекс также будет заблокирован / разблокирован в начале и в конце метода onHandleIntent старого IntentService.Тем не менее, я обеспокоен тем, какие последствия будут иметь блокировки мьютекса при создании IntentService, задерживая его создание (предположительно, super.create будет вызываться перед блокировкой).Сможет ли Интент все еще стоять в очереди?Есть ли другие подводные камни для этого?

1 Ответ

0 голосов
/ 22 февраля 2011

Поскольку я не могу вставить Intents в начало очереди IntentService (насколько я знаю)

Не со стандартной реализацией. Тем не менее, IntentService не большой класс. Вы можете клонировать его и заменить используемую сегодня Handler систему на PriorityBlockingQueue.

Есть ли другие подводные камни для этого?

Помимо того, что это пугает меня до чертиков с точки зрения возможных тупиков?

Вы можете взглянуть на ReentrantReadWriteLock или что-то в том же духе вместо пары Mutex. Хотя технически у вас нет сценария «чтение» или «запись», вы можете думать, что «чтение» и «запись» являются просто двумя приоритетами. Есть способы настроить такую ​​блокировку для поддержки «записи», поэтому ваш второй IntentService будет «записывать», а ваш первый IntentService будет «читать».

Но я бы действительно хотел заменить IntentService на рабочий, который имеет характеристики, которые вы ищете, вместо того, чтобы пытаться заставить два IntentServices работать вместе.

...