Я создал приложение, которое использует IntentService для управления базой данных приложения и вызова веб-служб.
Пример:
У меня есть активность, которая представляет собой список элементов. Этот список заполняется CursorAdapter. У каждого элемента есть флажок, и список упорядочен по отмеченным (неотмеченные элементы вверху и отмеченные элементы внизу). Когда флажок элемента установлен, я отправляю Intent в свой IntentService, сообщая ему, чтобы отметить отмеченный столбец в таблице базы данных для этого элемента, затем передается сообщение, действие видит его и повторно запрашивает курсор.
Когда я использую мобильное устройство и начинаю быстро проверять флажки, приложение практически зависает. Пользовательский интерфейс не зависает, но IntentService в фоновом режиме зависает. Я могу сказать, потому что курсор на экране не обновляется.
Насколько я понимаю, намерения, переданные в IntentServices, не обрабатываются асинхронно. Это правильно? Он ведет себя почти так, как будто мне нужно использовать семафоры, но я не могу понять, почему, если намерения ставятся в очередь и обрабатываются индивидуально.
Допустим, я установил 3 флажка; поэтому в очереди 3 намерения. После первого я передаю сообщение, которое получает действие, сообщая ему, что нужно запросить его курсор. Может ли потенциальная проблема заключаться в том, что я повторно запрашиваю курсор одновременно с обработкой второго намерения (обновлением другой строки в таблице)? Запрос курсора происходит в потоке пользовательского интерфейса.
^ Я думаю, что это моя проблема. Что я должен использовать для синхронизации этого? Семафоры? Может ли кто-нибудь указать мне на некоторые документы/примеры?
Другая потенциальная проблема заключается в том, что если моя активность управляет курсором на столе; также мой IntentService запрашивает курсор из той же таблицы. У меня есть случаи, когда это происходит, когда мой IntentService просматривает каждую строку в курсоре, чтобы найти элементы для отправки в веб-службу. Хотя я не думаю, что это будет проблемой, пока курсоры не запрашивают одновременно?
У кого-нибудь есть другие идеи?