我正在使用Android MediaPlayer类并尝试编写一个测试用例来验证是否调用了onCompletion方法。 在上一首曲目结束后,我用它来播放下一曲目。
当我使用模拟器(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类的一部分,因此它是同一个类。我将问题分解为上面的几行代码。
这花了我很多时间。我希望有人有解决方案!
非常感谢!!!
答案 0 :(得分:4)
我遇到过这个问题,没有什么对我有用。从MediaPlayer的官方网站(click me)可以找到以下句子:
为了接收与这些侦听器关联的相应回调,应用程序需要在运行自己的Looper的线程上创建MediaPlayer对象(默认情况下,主UI线程正在运行Looper)。
我有点失落,因为在onCompletionListener本身的API中没有提示这个需求。
答案 1 :(得分:2)
我认为问题是当MediaPlayer播放完mp3时你的测试用例不再运行了。因此,您的解决方案是保持测试用例处于活动状态,直到触发onCompletion()。
从IntentService播放文件时遇到了类似的问题。在回叫开始之前,该服务正在被销毁。
答案 2 :(得分:0)
实际上,原因是MediaPlayer是一个局部变量。 testContinuePlayNextTrack()完成后,GC收集MediaPlayer。因此修复很容易,使您的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!!!!!");
}
}