@amimamoya

Приложение вылетает на строке, где сказано поменять текст в TextView. В чём проблема?

Здравствуйте, дело вот в чём, я хочу в приложении после нажатия на кнопку высвечивать текущее время с точностью до секунд, делаю я это путём потока, в котором каждую секунду получается текущее время и ставится в TextView. Вроде бы всё хорошо, но после первой установки, когда время обновляется во второй раз, приложение вылетает с ошибкой android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
Вот код xml:
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:layout_marginLeft="150dp"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/label2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/but"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="125dp"
        android:text="Погнали!"
        android:onClick="butpress"/>

</androidx.appcompat.widget.LinearLayoutCompat>

А вот MainActivity:
public class MainActivity extends AppCompatActivity {
    TextView label;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        label = (TextView) findViewById(R.id.label2);
    }

    public void butpress(View view){
        ButPres nm = new ButPres();
        nm.actionPerformed();
    }

    class ButPres extends Thread{
        public void actionPerformed() {
            start();
        }

        boolean prov = true;

        @Override
        public void run() {
            while (prov) {
                String time = new SimpleDateFormat("kk:mm:ss").format(Calendar.getInstance().getTime());
                label.setText(time);
                try {
                    Thread.sleep(1000);
                } catch (Exception e) {
                    System.out.println(e);
                }
            }
        }

    }
}
  • Вопрос задан
  • 147 просмотров
Решения вопроса 1
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
Ну в общем оно тебе пишет же
Only the original thread that created a view hierarchy can touch its views.

Original thread это Main(UI) thread. Твой поток не может обратиться к UI. Можно использовать runOnUiThread.
Но вообще для этой задачи новый тред избыточен и даже вреден. Можно использовать Handler + postDelayed для достижения такого эффекта.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы