2016-11-09 95 views
0

我有一個代碼,它正在檢查文件夾中定義的類型的音頻文件並調用轉換器來更改其格式。現在當第一個文件通過時,轉換器被調用,並且當文件正在轉換過程中,for循環再次調用轉換器作爲第二個文件。在這個我感覺早/晚過程終止,因此我只獲得文件轉換爲輸出。代碼在這裏。我如何設法讓所有文件傳輸。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(); 
      } 
     } 

如果你發現有抗轉換成功的消息,我從來沒有這種下循環,而如果我通過只有一個文件,我得到了成功的消息。請諮詢。

+1

請聯絡庫的作者,以支持多個文件或做一些信號量(基本multithreinding同步概念)如果沒有完成之前的工作,將不允許'convert()'調用 – Selvin

+0

人們非常渴望降級初學者的問題而不是支持。我現在不敢問這裏。 –

+0

人們都懶得問以前做一些研究...... – Selvin

回答

0

您可以爲索引添加一個類實例變量並根據需要遞增,根據需要遞歸調用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(); 
     } 
    } 
} 
+0

邏輯上它工作正常,只剩下問題是因爲轉換器佔用太多的內存,所以系統開始掛起線程。 –

+0

很高興知道。如果您遇到內存問題,請使用更新的信息和代碼創建一個單獨的問題。祝你好運! – kpsharp