@ololopololoe

Java почему зависает цикл while в background потоке?

Добрый день, только начал изучать Java + android studio и сразу столкнулся с проблемой: пишу простое приложение - хочу чтобы кнопкой запускался/останавливался счетчик (1,2,3,4......)
5MZuV.jpgне могу понять почему приложение зависает и перестает отвечать если в background потоке счетчик делаю в цикле while.
вот код:
public class MainActivity extends AppCompatActivity {
private Button my_button;
private boolean  start_stop = false;
private int counter = 0;
private TextView my_text;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    my_button = findViewById(R.id.My_Button);
    my_text = findViewById(R.id.my_text);
}
public void onClick_button(View view) {
    if(start_stop != true) {
        my_button.setText("STOP");
        start_stop = true;

       runOnUiThread(new Runnable() {
            @Override
            public void run() {
                while (start_stop) {
                    my_text.setText(Integer.toString(counter));
                    counter++;
                    try {
                        Thread.sleep(1000);     // sleep 1 sec
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });

    }else {
        my_button.setText("START");
        start_stop = false;
    }
}
@Override
protected void onDestroy() {
    super.onDestroy();
    start_stop = false;
}
  • Вопрос задан
  • 86 просмотров
Пригласить эксперта
Ответы на вопрос 2
@AndroidRS
runOnUiThread выполняется в главном потоке, поэтому приложение и зависает
Ответ написан
@ololopololoe Автор вопроса
как обычно, решение помогли найти на Stackoverflow

package com.example.switch_pictures;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    private Button my_button;
    private boolean  start_stop = false;
    private int counter = 0;
    private TextView my_text;


        @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        my_button = findViewById(R.id.My_Button);
        my_text = findViewById(R.id.my_text);


        }
    public void onClick_button(View view) {
        if(start_stop != true) {
            my_button.setText("STOP");
            start_stop = true;

            new Thread(new Runnable() {
                @Override
                public void run() {
                    while (start_stop) {
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                my_text.setText(Integer.toString(counter));
                            }
                        });
                        counter++;
                        try {
                            Thread.sleep(100);     // sleep 1 sec
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }).start();


        }else {
            my_button.setText("START");
            start_stop = false;
        }
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        start_stop = false;
    }


}
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
CV Recruitment Москва
До 180 000 руб.
Amigoweb Магнитогорск
от 40 000 до 70 000 руб.
ЛАНИТ Москва
До 100 000 руб.
21 нояб. 2019, в 21:19
2000 руб./за проект
21 нояб. 2019, в 19:47
999 руб./за проект