Сервис, Наблюдатель и Петухи - PullRequest
3 голосов
/ 06 октября 2011

Я пытаюсь создать приложение, которое содержит Content Observers в удаленной службе, но постоянно получало сообщение об ошибке:

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

Я много читал на сайте разработчиков Android, а также много поисков в Google, но до сих пор не до конца понимаю проблему.До сих пор я понял, что Content Observer нужен поток для запуска (для обработчика).После добавления:

Looper.myLooper().prepare();<br/>mObserver = new Observer(new Handler());

вызов Looper непосредственно перед созданием нового Content Observer заставляет приложение работать правильно.Однако я хотел бы лучше понять, почему это так - ничто из того, что я нашел в Интернете, не помогло мне понять почему до сих пор.Кроме того, правильное и эффективное добавление строки кода Looper?И нужно ли мне что-то делать для предотвращения утечек памяти в будущем?

Чем проще объяснение, тем лучше.Тем не менее, в мой первый месяц разработки Android и достижения хорошего прогресса - StackOverflow оказал огромную помощь!Спасибо.

ОБНОВЛЕНИЕ После игры и больше чтения, я думаю, лучше понять, как сделать эту работу и как ее почистить, но при этом еще не хватает одной маленькой детали.

Из того, что я собрал, я могу назвать Looper.prepare() как статический метод.Затем я могу создать свой обозреватель контента, используя новый обработчик ().Когда я хочу остановить этот обозреватель контента, я могу получить поток объекта с помощью mLooper = Looper.myLooper.getThread (), а затем я могу запустить mLooper.quit ().Тем не менее, я должен и когда я буду и почему я должен вызывать mLooper.loop ()?

ОБНОВЛЕНИЕ 2 Итак, вот проблема, которую я решаю.Приложение находится в работе и немного сложно объяснить, но вот мой лучший способ:

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

Поэтому было бы хорошо использовать null в качестве параметра нового обозревателя контента или лучше использовать новый Handler () для создания потока для этого наблюдателя,

Я пытался создать поток, но пока он не работает, я думаю, что это потому, что я не запустил Looper.loop (это замораживает мой сервис).Любой совет будет принята с благодарностью!Заранее спасибо.

1 Ответ

3 голосов
/ 06 октября 2011

Когда вы запускаете Looper в потоке, другие потоки получают возможность отправлять ему сообщения, и он будет получать и обрабатывать их.Эта схема широко используется в Android: looper инициализируется в потоке пользовательского интерфейса, а другие потоки назначаются для выполнения некоторых длительных операций.Эти «рабочие» потоки могут отправлять результаты своего тяжелого труда в поток пользовательского интерфейса, отправляя сообщения в Handler.

И, да, вам нужно позвонить Looper.loop(), чтобы все заработало.В противном случае ваш обработчик никогда не получит никаких событий.И кажется, что вам придется вызывать Looper.quit(), чтобы остановить его и избежать утечки ресурсов.

И вот забавная часть.Судя по исходному коду ContentObserver , для него точно не требуется обработчик.Если вы передадите null, он просто выполнит onChange() в том же потоке, в котором он работает.

PS Мой компьютер dev не работает, поэтому у меня нет возможности проверить свои утверждения.Возможно, текущая версия ContentObserver требует, чтобы Handler работал.Эксперимент покажет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...