2011-07-13 2 views
1

У меня очень странная проблема в приложении, которое я пишу. Это может быть так же просто, что я не понимаю что-то об Услугах, AsyncTasks и когда у меня снова есть доступ к потоку пользовательского интерфейса.Услуги, AsyncTasks и CalledFromWrongThreadException

Приложение состоит из основного вида деятельности, посредством которого вы переходите к нескольким другим видам деятельности. Приложение имеет две службы, которые находятся в фоновом режиме и периодически опроса, когда приложение находится на переднем плане, а другое, которое запускает «AACPlayer» для потоковой передачи потокового радиопотока.

Один из видов деятельности, который имеет элементы управления пользовательского интерфейса для радио, начинает обслуживание радио. Для этого AsyncTask запускается для захвата и анализа файла PLS и, наконец, запускает службу с правильным URL-адресом потока. Запустится сервис, который также инициирует AACPlayer. Как только поток начал воспроизводиться, выдается широковещательная передача, в которой говорится, что поток начал играть. Широковещательный приемник в действии, который содержит радиоуправление, обрабатывает намерение и обновляет пользовательский интерфейс.

Это прекрасно работает, за исключением одного условия гонки, в котором, казалось бы, случайная комбинация выхода из приложения или резервного копирования из экрана радио, прежде чем Служба сообщит о своем намерении обновить интерфейс, теперь все остальные действия запускаются вне потока пользовательского интерфейса. Каждое другое действие, возбужденное во время этого условия, получает исключение из-за того, что оно находится в незаконном состоянии и не может изменять действие, связанное с UI, поскольку мы не работаем в потоке пользовательского интерфейса. Обычное сообщение об исключении вины: W/System.err(3818): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

Неужели кто-то еще столкнулся с тем, что внезапно все приложение больше не работает на своем обычном потоке пользовательского интерфейса, а все остальные действия сообщают об этом исключении? Я не думаю, что у меня есть какой-либо код, который делает что-то незаконное, что приведет к этой ошибке. Внутри AsyncTasks нет элементов интерфейса. Обратный вызов, который запускается широковещательным приемником (прием от радиослужбы), касается сенсорного интерфейса, но я не могу придумать другой способ сделать это?

Проблема не устранена, даже когда сила приложения завершает работу, но исправляется, когда приложение либо принудительно завершает работу, либо очищает данные от настроек Android.

EDIT - В соответствии с поручением, вот код, который описывает службы время начала и деятельность, которая запускает службу/контролирует пользовательский интерфейс: https://gist.github.com/1080797

Любые мысли будут оценены. Благодарю.

+0

добавить код пожалуйста ... – Marmoy

+0

Создал сущность с файлом службы и деятельность, которая «отвечает» за эту Службу. https://gist.github.com/1080797 – jlindenbaum

ответ

1

Попробуйте перевести инициализацию вашего PlayerServiceUpdateReceiver в onCreate(). Я не думаю, что вам нужно повторно инициализировать его на каждом onResume(), вам просто нужно перерегистрировать его. Ты знаешь, что я имею в виду?

Я думаю, что происходит то, что вы получаете обратные вызовы получателям, которые вы перезаписали новыми экземплярами.

Возможно, я ошибаюсь, и это правильный способ сделать это. Поправьте меня если я ошибаюсь.

+0

Инициализация теперь находится в onCreate, регистрация остается в onResume - это то, что вы имели в виду? https://gist.github.com/1080797/c473eb5084f53fc22c3a8b25cd136dede9958e0a – jlindenbaum

+0

Да, это имеет значение? – Marmoy

+0

Просто быть помещенным на устройства для тестирования. Трудно сказать, исправлено ли это, или мы просто не можем воспроизвести его. ;) Вы видели что-нибудь там, чтобы вы поступили иначе/лучше? – jlindenbaum

Смежные вопросы