Запустите цикл и остановите код одним нажатием кнопки

Я хочу сделать простую кнопку, которая будет запускать цикл функции каждый период времени, который я могу установить. Но он не только запустит цикл, но и остановит цикл, если я снова нажму кнопку. В любом случае я могу добиться этого с помощью одной кнопки?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
340
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Да, приведу простой пример.

Сначала создайте два постоянных значения и одну переменную экземпляра:

 //indicate whether or not the loop is running
    private boolean isRunning = false;

    //used for handler to send empty msg
    private final static int MSG_LOOP = 1;
    private final static long LOOP_INTERVAL = 5000;

Затем создайте экземпляр Handler для обработки логики цикла:

Handler handler = new Handler() {
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case MSG_LOOP:
                    doStuff();
                    break;
            }
        }
    };


    private void doStuff() {
        //after what you want to do is done, send another MSG_LOOP msg with delay
        handler.sendEmptyMessageDelayed(MSG_LOOP, LOOP_INTERVAL);
    }

И наконец:

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (isRunning) {
                    //cancel if any in the message queue
                    handler.removeMessages(MSG_LOOP);
                } else {
                    //if you do not want to start the loop immediately, then use: "sendEmptyMessageDelayed"
                    handler.sendEmptyMessage(MSG_LOOP);
                }

            }
        });
Ответ принят как подходящий

Вот как бы я это сделал

public class MainActivity extends AppCompatActivity {

    private Button btn;
    private View.OnClickListener runOnClickListener;
    private View.OnClickListener stopOnClickListener;


    void init() {
        Handler handler = new Handler();
        int duration = 5000;

        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                foo();
                handler.postDelayed(this, duration);
            }
        };

        runOnClickListener = view -> {
            runnable.run();
            btn.setOnClickListener(stopOnClickListener);
        };

        stopOnClickListener = view -> {
            handler.removeCallbacks(runnable);
            btn.setOnClickListener(runOnClickListener);
        };

       btn.setOnClickListener(runOnClickListener);
    }

    void foo() {
        Log.i("foo", "foo");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn = findViewById(R.id.btn);

        init();
    }
}
runOnClickListener и stopOnClickListener выдали мне ошибку. Вы можете помочь мне?
Prototype7 11.12.2020 08:37

Может быть, потому что я использую лямбда-выражения. Попробуйте использовать new View.OnClickListener() вместо view ->

Cole Tustin 11.12.2020 13:00

Большое спасибо! Отлично работает.

Prototype7 14.12.2020 03:38

Другие вопросы по теме