2012-01-23 67 views
2

我正在使用Android MediaPlayer類,並試圖編寫一個驗證onCompletion方法被調用的testcase。 我用它在前一個完成後播放下一個音軌。未在JUnit Testcase(AndroidTestCase)中調用Android MediaPlayer OnCompletionListener!

當我使用模擬器(2.1或4.0)運行應用程序時,onCompletion方法被調用並且下一個軌道開始播放,但是在測試用例中它不是。 這裏是簡化的代碼:

public class MediaPlayerControllerTest extends AndroidTestCase implements OnCompletionListener { 

    public void testContinuePlayNextTrack() { 
     MediaPlayer mediaPlayer = new MediaPlayer(); 
     mediaPlayer.setOnCompletionListener(this); 
     try { 
      mediaPlayer.setDataSource("/mnt/sdcard/5749/01.mp3"); 
      mediaPlayer.prepare(); 
     } 
     catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     mediaPlayer.start(); 
    } 

    @Override 
    public void onCompletion(MediaPlayer mp) { 
     System.out.println("ON COMPLETION!!!!!"); 
    } 
} 

上面的代碼通常是其在該應用和試驗中所用的一類MediPlayerController的一部分,所以它是相同的類。我將問題分解爲上面幾行代碼。

這花了我很多時間。我希望有人有解決方案!

非常感謝!

回答

2

我認爲問題在於MediaPlayer完成播放mp3後,測試用例不再運行。所以你的解決方案是保持測試用例活着,直到onCompletion()被觸發。

從IntentService播放文件時,我遇到了類似的問題。該服務在回調啓動之前被銷燬。

+0

你是如何解決與IntentService您的問題被銷燬onCompletionListener叫過嗎? –

+2

我重寫onDestroy()來延遲,直到我設置一個標誌指示我的媒體文件完成運行。也許不是最優雅的解決方案。我寫的應用程序是一個簡單的概念驗證。事後看來,我可能從頭開始構建了一個Service,而不是使用IntentService。 – shammer64

4

我遇到了這個問題,沒有任何工作對我來說。從對MediaPlayer的人們可以找到下面這句話的官方網站(click me)

爲了接收這些聽衆相關的各自的回調,應用程序需要創建的MediaPlayer上有自己的活套運行的線程(主要對象UI線程默認運行Looper)。

我有點失落,因爲在onCompletionListener本身的API中沒有提示這種需求。

+1

這解釋了爲什麼當從後臺任務開始播放時它不起作用,但從前臺任務開始播放時確定無效。多麼痛苦...... – SoloPilot

0

其實,原因是MediaPlayer是一個局部變量。 testContinuePlayNextTrack()完成後,MediaPlayer由GC收集。所以修復很簡單,讓您的MediaPlayer成爲該課程的一員。

public class MediaPlayerControllerTest extends AndroidTestCase implements OnCompletionListener { 
    MediaPlayer mediaPlayer = new MediaPlayer(); 

    public void testContinuePlayNextTrack() { 
     mediaPlayer.setOnCompletionListener(this); 
     try { 
      mediaPlayer.setDataSource("/mnt/sdcard/5749/01.mp3"); 
      mediaPlayer.prepare(); 
     } 
     catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     mediaPlayer.start(); 
    } 

    @Override 
    public void onCompletion(MediaPlayer mp) { 
     System.out.println("ON COMPLETION!!!!!"); 
    } 

}