Как обновить TextView из другого потока?

Кажется всё понятным но не получается самое главное обновить Text в MainActivity.

Принятые данные от bluetooth. Имею следующее: Есть главная активити в которой пару кнопок. Поиск устройств / сопряжение и т.д. - это работает. Так же есть кнопка отправить данные: тоже работает.

Но при подключении к устройству (серверу) я в классе Connect запуская новый поток Класса Read. То есть когда я отображаю главную активити у меня всё время крутится поток в классе READ который ждёт приходящие данные - с этим он успешно справляется и все получает. Но вот как мне их вывести в TextView в Main я так и не понял. Я создавал в Main - Handler

Handler mHandler = new Handler(Looper.getMainLooper()){
    @Override
    public void handleMessage(@NonNull Message msg) {
        super.handleMessage(msg);
        Log.d(TAG, "handleMessage: "+msg.what);
        switch (msg.what){
            case 5:
                Log.d(TAG, "handleMessageObj: "+msg.obj);
                Data=msg.what;
               getTextView.setText(msg.what);
        }
    }
};

Если я в него отправляю данные из MAIN просто самостоятельно для теста то всё работает и TextView заполняется данными. Но как мне в него отправить данные из потока другого класса Read? Если я туда передам из главной Activity этот handler то данные я получаю в главном цикле public void handleMessage Но при попытке записать их в getTextView.setText(msg.what); Получаю ошибку: С элементами можно работать только из родного потока. Вот тут я не могу понять. Надеюсь хорошо расписал. Очень надеюсь на ответ. Спасибо.


Ответы (1 шт):

Автор решения: Vadik

Чтобы ваш код отработал, нужно у объекта Handler вызвать метод post, куда передать экземпляр Runnable:

Handler mainHandler = new Handler(Looper.getMainLooper());
mainHandler.post(new Runnable() {
    @Override
    public void run() {
        textView.setText("Hello World");
    }
});

То же самое можно написать покороче, если воспользоваться методом runOnUiThread:

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        textView.setText("Hello World");
    }
});

Или, используя лямбды:

runOnUiThread(() -> {
    textView.setText("Hello World");
});
→ Ссылка