2012-01-23 2 views
2

Android MediaPlayer 클래스를 사용 중이며 onCompletion 메서드가 호출되는지 확인하는 테스트 사례를 작성하려고합니다. 이전 트랙이 끝난 후 다음 트랙을 재생할 때 사용합니다.Android MediaPlayer OnCompletionListener가 JUnit Testcase (AndroidTestCase)에서 호출되지 않았습니다!

에뮬레이터 (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와 문제를 해결하는 데 도움이 되었습니까은 파괴되고? –

+2

나는 미디어 파일의 실행이 끝났음을 나타내는 플래그를 설정할 때까지 onDestroy()를 오버로드했다. 아마도 가장 우아한 해결책은 아닙니다. 내가 작성한 앱은 간단한 개념 증명이었다. 처음부터 IntentService를 사용하는 대신 처음부터 서비스를 구축했을 수도 있습니다. – shammer64

4

이 문제가 발생하여 아무 것도 작동하지 않았습니다. 다음 문장을 찾을 수 MediaPlayer를 하나의 공식 사이트 (click me)에서 :

이 청취자와 관련된 각각의 콜백을 수신하기 위해, 응용 프로그램은 MediaPlayer를 자체 루퍼가 실행하는 스레드 (메인 개체를 만드는 데 필요한 UI 스레드는 기본적으로 루퍼가 실행 중입니다.

oncompletionListener 자신을위한 API에서이 필요성에 대한 힌트가 없었기 때문에 조금 잃어 버렸습니다.

+1

그 이유는 재생이 백그라운드 작업에서 시작되었을 때 작동하지 않았지만 포어 그라운드 작업에서 시작할 때 정상적으로 작동하는 이유를 설명합니다. 참 아플거야. – SoloPilot

0

실제로 MediaPlayer는 로컬 변수입니다. testContinuePlayNextTrack()이 끝나면 MediaPlayer가 GC에 의해 수집됩니다. 수정이 쉽기 때문에 MediaPlayer를 클래스의 멤버로 만듭니다. onCompletionListener가 호출되기 전에

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!!!!!"); 
    } 

}

관련 문제