Использование Syncroniation ждать / уведомлять о полной остановке программы от работающего Android - PullRequest
0 голосов
/ 04 ноября 2018

Я пытаюсь остановить цикл for и дождаться завершения метода и продолжить после вызова onFinish. Мне предложили использовать CyclicBarrier или syncronized wait/notify, но ни один из них не работает.

Когда я запускаю метод без "stoppers", он всегда достигает onFinish, вызывая все 3 System.out.prints, но когда я добавляю либо CyclicBarrier or syncronized, он просто не запускается ticking. То есть он печатает только первую строку countDownTimer first call, затем останавливается и ничего не делает.
Просто чтобы сделать его короче, я добавил оба stoppers здесь, чтобы показать, как я справился с любым из них, но я использовал их отдельно.

Что я могу сделать, чтобы сделать это "tick"?

    cyclicBarrier = new CyclicBarrier(2);
    object = new Object();


    for (int i = 0; i < sentenceList.size() - 1; i++) {
        String currentLyricLine = sentenceList.get(i).content;

        long diff = sentenceList.get(i+1).fromTime - sentenceList.get(i).fromTime;
        int interval = (int) (diff / sentenceList.get(i).wordCount);


        if(isFirstLine) {
            startLyricCountDownTimer(diff, interval, currentLyricLine, coloredLyricsTextViewFirstLine);
            isFirstLine = false;
        } else {
            startLyricCountDownTimer(diff, interval, currentLyricLine, coloredLyricsTextViewSecondLine);
            isFirstLine = true;
        }


        //First tried with this
        synchronized (object) {
            try {
                object.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        //Then tried with this
        try {
            cyclicBarrier.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (BrokenBarrierException e) {
            e.printStackTrace();
        }
    }

}


private void startLyricCountDownTimer(final long millisInFuture, final int countDownInterval, String lyrics, final ColoredLyricsTextView coloredLyricsText){
    System.out.println("countDownTimer first call" );
    coloredLyricsText.setText(lyrics);

    new Handler(Looper.getMainLooper()).post(new Runnable() {
        @Override
        public void run() {
            new CountDownTimer(millisInFuture,10) {
                @Override
                public void onTick(long millisUntilFinished) {
                    System.out.println("countDownTimer second call + " + millisUntilFinished);
                    //Do some stuff (irrelevant since it never gets here)
                }

                @Override
                public void onFinish() {
                    System.out.println("countDownTimer last call" );
                     //First tried with this
                    synchronized (object) {
                        object.notify();
                    }

                    //Then tried with this
                    try {
                        cyclicBarrier.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } catch (BrokenBarrierException e) {
                        e.printStackTrace();
                    }
                }
            }.start();
        }
    });


}

Если я правильно понимаю, то было также упомянуто, что я запускаю свой цикл в потоке пользовательского интерфейса, поэтому все останавливается. И хорошо, я не хочу останавливать поток пользовательского интерфейса, просто ждать завершения одного countDownTimer, а затем начинать новый цикл.

...