Как обновить 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 шт):
Чтобы ваш код отработал, нужно у объекта 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");
});