for循环等待被调用方法完成

For loop wait for completion of called method

我有一个代码正在检查文件夹中定义的音频文件类型并调用转换器来更改其格式。现在,当传递第一个文件时,将调用转换器,并且当文件正在转换过程中时,for 循环再次为第二个文件调用转换器。在此我觉得 earlier/later 进程已终止,因此我只将文件转换为输出。代码在这里。我怎样才能成功转换所有文件。

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 循环下得到它,而如果我只传递一个文件,我会得到成功消息。请指教。

您可以为索引添加一个 class 实例变量并根据需要递增它,根据需要递归调用 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();
        }
   }
}