Остановка цикла до вызова метода onFinished () - PullRequest
0 голосов
/ 03 ноября 2018

Как я могу остановить цикл for и дождаться завершения метода и продолжить после вызова onFinish()?

Одним из решений, которое я мог придумать, было использование listeners и вызов этого, когда метод вызывает onFinish(), но я не знаю, как остановить цикл и ждать listener. Также такие функции, как wait() не будут работать, потому что doCountDown() может занять больше или меньше, чем wait()

for (int i = 0; i < 1; i++) {
    doCountDown();
    //Pause and wait for doCountDown() to finish
}

private void doCountDown(){

        new Handler(Looper.getMainLooper()).post(new Runnable() {
            @Override
            public void run() {
                new CountDownTimer(30000,100) {
                    @Override
                    public void onTick(long millisUntilFinished) {
                        //Do some stuff
                    }

                    @Override
                    public void onFinish() {
                        //Continue loop
                    }
                }.start();
            }
        });
}

Ответы [ 4 ]

0 голосов
/ 05 ноября 2018

здесь ответ на ваш комментарий о реализации только 1 таймера:

private void doCountDowns(int count){

    new Handler(Looper.getMainLooper()).post(new Runnable() {
        @Override
        public void run() {
            int timer = 0; // if each timer does something else
            int ticks = 0;
            new CountDownTimer(30000 * count,100) {
                @Override
                public void onTick(long millisUntilFinished) {
                    //Do some stuff
                    if ((ticks++) == 3000) {
                        ticks = 0;
                        timer++;
                    }
                }

                @Override
                public void onFinish() {
                    // called only once, when everything is done
                }
            }.start();
        }
    });
}

doCountDowns(10) запускает таймер на 10x 30000 мс, который тикает 3000x (каждые 100 мс). Может ли это решить вашу проблему? Если у каждого из ваших таймеров есть другая задача (однако это не так), вы можете ввести поля ticks и timer для подсчета количества тиков и таймера.

Может быть, вы могли бы попытаться объяснить, почему вам нужно 10 таймеров, каждый из которых работает на 30.000 мс, а не 1 таймер на 300.000 мс.

0 голосов
/ 03 ноября 2018

Работает с Object.wait и Object.notify методами.

// Whatever object
Object obj = new Object();

        for (int i = 0; i < 1; i++) {
            doCountDown(obj);
            // Pause and wait for doCountDown() to finish
            synchronized (obj) {
                try {
                    obj.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }

    private void doCountDown(Object obj) {

        new Handler(Looper.getMainLooper()).post(new Runnable() {
            @Override
            public void run() {
                new CountDownTimer(30000, 100) {
                    @Override
                    public void onTick(long millisUntilFinished) {
                        // Do some stuff
                    }

                    @Override
                    public void onFinish() {
                        // Continue loop
                        synchronized (obj) {
                            obj.notify();
                        }
                    }
                }.start();
            }
        });
    }
0 голосов
/ 04 ноября 2018

Вы также можете использовать рекурсию, которая даст вам нужный вам результат.

doAnotherLine(0);

private void doAnotherLine(int i){
    //Some stopper method.. for example something like this
    if(i < list.size -1) doCountDown(i);

}

private void doCountDown(final int i){

        new Handler(Looper.getMainLooper()).post(new Runnable() {
            @Override
            public void run() {
                new CountDownTimer(30000,100) {
                    @Override
                    public void onTick(long millisUntilFinished) {
                        //Do some stuff
                    }

                    @Override
                    public void onFinish() {
                        doAnotherLine(i+1);
                    }
                }.start();
            }
        });
}
0 голосов
/ 03 ноября 2018

Вы можете использовать CyclicBarrier . Его можно использовать повторно, поэтому вам не нужно каждый раз его создавать.

// this will create barrier for 2 parties.
CyclicBarrier barrier = new CyclicBarrier(2);
for (int i = 0; i < count; i++) {
    doCountDown();
    //Pause and wait for doCountDown() to finish
    // add try catch around for interrup exception
       barrier.await();
}
.......
@Override
public void onFinish() {
     ////Continue loop
      barrier.await();
}
...