Для цикла дождитесь завершения вызываемого метода

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

public void convertAudio(View v) {


        final File pathanme = new File(Environment.getExternalStorageDirectory() + "/sdcard/test");
        File files[] = pathanme.listFiles();
        for (File f : files) {
            if (f.getName().endsWith(".mp4")) {
                String filename = f.getName().toLowerCase().toString();
                System.out.println(filename);

                File wavFile = new File(pathanme, filename);
                IConvertCallback callback = new IConvertCallback() {
                    @Override
                    public void onSuccess(File convertedFile) {
                        Toast.makeText(NewMainActivity.this, "SUCCESS: " + convertedFile.getPath(), Toast.LENGTH_LONG).show();
                    }

                    @Override
                    public void onFailure(Exception error) {
                        Toast.makeText(NewMainActivity.this, "ERROR: " + error.getMessage(), Toast.LENGTH_LONG).show();
                    }
                };
                Toast.makeText(this, "Converting audio file..." + filename, Toast.LENGTH_SHORT).show();

                AndroidAudioConverter.with(this)
                        .setFile(wavFile)
                        .setFormat(AudioFormat.MP3)
                        .setCallback(callback)
                        .convert();
            }
        }

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

1 ответ

  1. Можно добавить переменную экземпляра класса для индекса и увеличить ее по мере необходимости, вызывая convert()метод рекурсивно по мере необходимости. Это выглядело бы примерно так (Java немного ржавый, вам, возможно, придется очистить синтаксис):

    public class MyClass {
    
       private int fileIndex = 0;
       private File[] files;
    
       public void convertAudio(View v) {
         final File pathanme = new File(Environment.getExternalStorageDirectory() + "/sdcard/test");
         this.files = pathanme.listFiles();
         fileIndex = 0;
         convertFile(files[fileIndex]);
    
      }
    
       private void convertFile(File f) {
          if (f.getName().endsWith(".mp4")) {
             String filename = f.getName().toLowerCase().toString();
             System.out.println(filename);
    
             File wavFile = new File(pathanme, filename);
             IConvertCallback callback = new IConvertCallback() {
                @Override
                public void onSuccess(File convertedFile) {
                   Toast.makeText(NewMainActivity.this, "SUCCESS: " + convertedFile.getPath(), Toast.LENGTH_LONG).show();
                   fileIndex++;
                   if (this.files.size > fileIndex) {
                      convertFile(this.files[fileIndex];
                   } else {
                      // we're done converting
                   }
                }
    
                @Override
                public void onFailure(Exception error) {
                   Toast.makeText(NewMainActivity.this, "ERROR: " + error.getMessage(), Toast.LENGTH_LONG).show();
                   // cancel out or keep going, whatever
                }
             };
    
                Toast.makeText(this, "Converting audio file..." + filename, Toast.LENGTH_SHORT).show();
    
                AndroidAudioConverter.with(this)
                        .setFile(wavFile)
                        .setFormat(AudioFormat.MP3)
                        .setCallback(callback)
                        .convert();
            }
       }
    }