【问题标题】:Android MediaPlayer OnCompletionListener not called in JUnit Testcase (AndroidTestCase)!JUnit测试用例(Android TestCase)中未调用Android MediaPlayer OnCompletionListener!
【发布时间】:2012-01-23 13:12:10
【问题描述】:

我正在使用 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 类的一部分,所以它是同一个类。我将问题分解为上面的几行代码。

这花了我很多时间。我希望有人有一个解决方案!

非常感谢!!!

【问题讨论】:

    标签: android junit media-player


    【解决方案1】:

    我遇到了这个问题,但没有什么对我有用。从 MediaPlayer 的官方网站(click me) 可以找到以下句子:

    为了接收与这些侦听器相关联的相应回调,应用程序需要在运行自己的 Looper 的线程上创建 MediaPlayer 对象(默认情况下,主 UI 线程运行 Looper)。

    我有点迷茫,因为在 onCompletionListener 自己的 API 中没有提示这种需求。

    【讨论】:

    • 这就解释了为什么从后台任务开始播放时它不起作用,但从前台任务开始播放时就可以了。好痛啊……
    【解决方案2】:

    我认为问题在于,当 MediaPlayer 播放完 mp3 后,您的测试用例不再运行。所以你的解决方案是让测试用例保持活动状态,直到 onCompletion() 被触发。

    从 IntentService 播放文件时,我遇到了类似的问题。在发起回调之前,Service 已被销毁。

    【讨论】:

    • 在调用 onCompletionListener 之前,您是如何解决 IntentService 被销毁的问题的?
    • 我覆盖了 onDestroy() 以延迟,直到我设置一个标志,指示我的媒体文件完成运行。也许不是最优雅的解决方案。我编写的应用程序是一个简单的概念验证。事后看来,我可能从头开始构建了一个服务,而不是使用 IntentService。
    【解决方案3】:

    其实原因是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!!!!!");
        }
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多