#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