ИнтентСервис вклинивается - PullRequest
1 голос
/ 06 октября 2010

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

Пример:

У меня есть действие, представляющее собой список элементов.Этот список заполняется CursorAdapter.Каждый элемент имеет флажок, и список упорядочен по флажку (непроверенные элементы сверху и отмеченные элементы снизу).Когда флажок элемента установлен, я отправляю Intent своему IntentService, чтобы он пометил отмеченный столбец в таблице базы данных для этого элемента, затем передается сообщение, Activity видит его и повторно запрашивает Cursor.

Когда я использую мобильное устройство и начинаю быстро устанавливать флажки, приложение по существу зависает.Пользовательский интерфейс не зависает, а IntentService в фоновом режиме.Я могу сказать, потому что Курсор на экране не обновляется.

Насколько я понимаю, Интенты, переданные IntentServices, не обрабатываются асинхронно.Это верно?Он ведет себя почти так, как будто мне нужно использовать семафоры, но я не могу понять, почему, если Интенты ставятся в очередь и обрабатываются индивидуально.

Предположим, я установил 3 флажка;Таким образом, есть 3 намерения в очереди.После первого я передаю сообщение, которое получает Activity, сообщая, что нужно запросить его курсор.Может ли быть потенциальная проблема, потому что я запрашиваю Курсор одновременно с обработкой второго Намерения (обновляя другую строку в таблице)?Запрос курсора происходит в потоке пользовательского интерфейса.

^ Я думаю, что это моя проблема.Что я должен использовать для синхронизации этого?Семафоры?Может кто-нибудь указать мне какую-нибудь документацию / примеры?

Другая потенциальная проблема заключается в том, что если моя активность управляет курсором на столе;также мой IntentService запрашивает курсор из той же таблицы.У меня есть случаи, когда это происходит, когда мой IntentService просматривает каждую строку в курсоре, чтобы найти элементы для отправки в веб-службу.Хотя я не думаю, что это будет проблемой, если Курсоры не запрашивают одновременно?

У кого-нибудь есть другие идеи?

1 Ответ

1 голос
/ 07 октября 2010

Когда флажок элемента установлен, я отправляю Intent в мой IntentService, говоря ему пометить отмеченный столбец в таблице базы данных для этого элемента, затем передается сообщение, Activity видит его и повторно запрашивает Cursor.

Это чувство "использования Buick, чтобы ударить муху".

Насколько я понимаю, содержимое, переданное IntentServices, не обрабатывается асинхронно. Это правильно?

onHandleIntent() в вашем IntentService вызывается в фоновом потоке, а startService() всегда асинхронный.

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

Индивидуальный Intents ставится в очередь и обрабатывается последовательно IntentService.

Может ли быть потенциальная проблема, потому что я запрашиваю Курсор одновременно с обработкой второго Намерения (обновляя другую строку в таблице)?

Это, конечно, не помогает.

Что я должен использовать для синхронизации? Семафоры?

Я бы просто использовал synchronized(someStaticDataMember), но семафоры должны работать.

Хотя я не думаю, что это будет проблемой, если Курсоры не будут запрашивать одновременно?

Фактический запрос не выполняется, пока не будет нажата Cursor (например, moveToFirst(), getCount()). После этого, пока набор результатов запроса меньше 1 МБ, результаты целиком находятся в Cursor.

Я частично согласен с Кристофером: используйте некоторую регистрацию, чтобы точно выяснить, что происходит, и подумайте об упрощении этого процесса (например, AsyncTask для записи в базу данных, а не IntentService).

...