【问题标题】:For loop wait for completion of called methodFor循环等待被调用方法的完成
【发布时间】:2016-11-09 16:37:00
【问题描述】:

我有一个代码检查文件夹中定义的音频文件类型并调用转换器来更改其格式。现在,当第一个文件通过时,转换器被调用,并且由于文件正在转换过程中,for 循环再次为第二个文件调用转换器。在这我觉得早/晚的过程被终止,因此我只得到文件转换为输出。代码在这里。我怎样才能设法获得所有文件的转换。

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

【问题讨论】:

  • 请联系库的作者以支持多个文件或做一些信号量(基本的多线程同步概念),这将不允许 convert() 在没有完成之前的工作的情况下调用
  • 人们如此热衷于将初学者的问题降级而不是支持。我现在不敢在这里问。
  • 人们在做一些研究之前都懒得问...
  • 这是你的看法,你有没有检查我的搜索日志,在询问之前花在研究或寻找解决方案上的时间。如果你不喜欢这些愚蠢的问题,我要求不要评论他们

标签: java android file audio-converter


【解决方案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();
        }
   }
}

【讨论】:

  • 逻辑上它工作正常,唯一剩下的问题是转换器占用太多内存,所以系统开始挂起线程。
  • 很高兴知道。如果您遇到内存问题,请使用更新的信息和代码创建一个单独的问题。祝你好运!
猜你喜欢
  • 2014-07-19
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 2021-08-09
  • 2015-07-02
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多