У меня очень странная проблема в приложении, которое я пишу. Это может быть так же просто, что я не понимаю что-то об Услугах, 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
Любые мысли будут оценены. Благодарю.
добавить код пожалуйста ... – Marmoy
Создал сущность с файлом службы и деятельность, которая «отвечает» за эту Службу. https://gist.github.com/1080797 – jlindenbaum