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 и отправку в view, по-прежнему получают CalledFromWrongThreadException и другие подобные вопросы, но в основном они касаются AsyncTasks. У меня нет AsyncTask в моем случае.

Есть предположения?


person Kiran Parmar    schedule 25.11.2015    source источник
comment
Используйте Activity.runOnUIThread(новый Runnable...)   -  person Nanoc    schedule 25.11.2015
comment
Я не могу сделать это. Как я уже упоминал, мой код находится в Android-keyguard по умолчанию, который не является действием. Это представление, которое прикрепляется к пользовательскому интерфейсу непосредственно через WindowManager.   -  person Kiran Parmar    schedule 25.11.2015
comment
Можете ли вы сделать ((Activity)view.getContext()).runOnUIThread...?   -  person Nanoc    schedule 25.11.2015
comment
@Nanoc Это не деятельность. Приведение типов не сработает. Используемый контекст такой же, как и созданный процессом SystemServer.   -  person Kiran Parmar    schedule 25.11.2015
comment
У вас должен быть способ вызвать runOnUIThread, опубликуйте больше своего кода, пожалуйста.   -  person Nanoc    schedule 25.11.2015
comment
Метод @Nanoc runOnUIThread() доступен только для Activity. Я не могу показать свой код из-за политики компании, но я могу указать вам файл Andoird по умолчанию, который я меняю. Он находится здесь: android.googlesource.com/platform/frameworks/base/+/ Здесь я добавил метод refreshUI() и объект BroadReceiver, зарегистрированный в onFinishInflate(). Остальное описано в моем вопросе.   -  person Kiran Parmar    schedule 26.11.2015
comment
Попробуйте использовать обработчик следующим образом: .com/questions/7860384/   -  person Nanoc    schedule 26.11.2015
comment
view.post() внутренне вызывает runnable в обработчике. Так чем же это отличается? См. код здесь: android.googlesource.com/platform/frameworks/base/+/   -  person Kiran Parmar    schedule 26.11.2015
comment
Не вижу вызова getMainLooper, так что я не буду спорить, это то же самое, вы можете просто попробовать?   -  person Nanoc    schedule 26.11.2015


Ответы (1)


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

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

    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            view.refreshUI();
        }
    });
person Raul Mauricio Ramirez D    schedule 26.11.2015
comment
Не хотите уточнить для операции? Только прямые ответы не очень хороши, даже если они отвечают на вопрос. - person Emz; 26.11.2015
comment
runOnUiThread недоступен за пределами Activity. Как я уже упоминал в вопросе, этот код не работает в действии - person Kiran Parmar; 16.04.2019