Как приостановить текущий цикл без приостановки текущего запущенного потока в Android / Java?

#java #android #multithreading #mp4parser

#java #Android #многопоточность #mp4parser

Вопрос:

В моем приложении для Android, в моем фрагменте, у меня есть один цикл while, например

 startMs=0, endMs=30000;
while(i<10){
    new Mp4Composer(inputPath, destPath)
                                .trim(startMs, endMs)
                                .listener(new Mp4Composer.Listener() {
                                   @Overide
                                     public void onCompleted(){

                                        }
                                   }
                                .start();
startMs= endMs;
endMs =30000;
i  
}
  

Здесь новый Mp4Composer — это поток… Эта задача выполняется для каждой итерации цикла .. без завершения предыдущей задачи (для задачи, все еще находящейся в состоянии обработки)… цикл перешел к следующей итерации.таким образом, существующая задача не выдает никаких выходных данных … и перешла к следующей задаче из-за цикла.

Итак, здесь я хочу, чтобы цикл while должен ждать завершения каждого нового Mp4Composer для каждой задачи. С помощью метода public void OnCompleted() … мы можем определить, когда эта асинхронная задача завершится для каждой задачи.

И здесь я не должен приостанавливать текущий запущенный поток (где класс во время выполнения цикла). Причина в том, что когда я делаю паузу, когда цикл помещает поток класса, общий пользовательский интерфейс и мое приложение для Android приостанавливаются. У меня не так много знаний о потоке.

Ответ №1:

 Handler mHandler = new Handler();
int startMs=0, endMs=30000, i=0;
Runnable action = new Runnable(){
    @Override
    public void run() {
        new Mp4Composer(inputPath, destPath)
                .trim(startMs, endMs)
                .listener(new Mp4Composer.Listener() {
                    @Overide
                    public void onCompleted(){
                        goNext();
                    }
                }
                .start();
    }
};
void goNext(){
    if(i < 10) {
        startMs = endMs;
        endMs  = 30000;
        i  ;
        mHandler.postDelayed(action, 2000); //2 second
    }
}
  

Ответ №2:

используйте обработчик вместо цикла while