Я пытаюсь остановить цикл 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
, а затем начинать новый цикл.