Android: получение CalledFromWrongThreadException, даже если Runnable опубликован в представлении

У меня странная проблема. Мой код имеет широковещательный приемник, который делает это в свой onReceive():

view.post(new Runnable() {
    @Override
    public void run() {
    view.refreshUI();
}});

Я не понимаю причину, по которой этот код представляет android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

Я уже выкладываю refreshUI() позвони внутрь Runnable на view, Так как же он не работает в UI-потоке?

Другое странное наблюдение заключается в том, что служба отправки широковещательных сообщений даже не отправила трансляцию в случае, когда я вижу этот сбой. Я знаю это, потому что есть операторы, записанные в logcat как на стороне отправителя, так и на стороне получателя. Но одно из этого присутствует до крушения.

Чтобы дать некоторое представление, приведенный выше код написан внутри платформы Android, для клавиатуры (или экран блокировки). Я работаю над исходным кодом Android 4.3, который настроен для нашего оборудования / платы.

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

Я уже прошел Запуск на UIThread и публикацию для просмотра, все еще получаю CalledFromWrongThreadException и другие подобные вопросы, но они в основном имеют дело с AsyncTasks, у меня нет никаких AsyncTask в моем случае.

Какие-нибудь мысли?

1 ответ

Вы должны использовать runOnUiThread(), когда хотите обновить свой пользовательский интерфейс из потока, не являющегося пользовательским интерфейсом. Например, если вы хотите обновить свой пользовательский интерфейс из фоновой темы. Вы также можете использовать Handler для того же.

Вы должны использовать это:

    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            view.refreshUI();
        }
    });
Другие вопросы по тегам