当我期望它时,onCompletion没有被调用

时间:2011-01-27 06:42:05

标签: android

我在我的父类中发布了一个MediaPlayer成员变量,在我启动之后,它不会调用onCompletion,或者至少onCompletionListener没有捕获它?我的代码看起来有点效果

mediaPlayer = Mediaplayer.create(this, currentSample);
mediaPlayer.start();

代码中的其他地方是我的onCompletionListener

mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
    public void onCompletion(MediaPlayer mp) {      
        if (repeatFlag == true) {
            handler.removeCallbacks(sampleRunnable);
            handler.postDelayed(sampleRunnable, delay);
        }
    }   
});

我正在使用处理程序来调用sampleRunnable,因为我想以指定的延迟间隔循环它。但是,onCompletion似乎永远不会被调用。我对此非常肯定,因为我在onCompletion中设置了断点,它永远不会暂停程序,我试图单步执行它似乎永远不会被调用。有任何想法吗?

7 个答案:

答案 0 :(得分:5)

    mediaPlayer.start();
    mediaPlayer.setOnCompletionListener(new OnCompletionListener() 
    {
        @Override
        public void onCompletion(MediaPlayer arg0) 
        {
            Log.v("Tag", "Completed");
        }
    });

此代码段工作正常。唯一的区别是“@Override”,我不确定“@Override”是否对代码产生影响。

答案 1 :(得分:4)

根据我的经验,在某些设备上不会触发监听器:/

答案 2 :(得分:1)

我也有这个问题。它与覆盖注释无关。

在配置Visualizer之前设置了侦听器。在我访问了可视化工具的MediaPlayer之后,我移动了setOnCompletionListener() - 这解决了我的问题。确保在最新阶段调用该方法。

答案 3 :(得分:0)

我必须单独上课才能让它发挥作用。没有多少压倒一切。

    private class SoundtrackPlayerListener implements MediaPlayer.OnCompletionListener{

    public void onCompletion(MediaPlayer mp) {
                 //completion code here
            }
     }

答案 4 :(得分:0)

我和其他几位学生在我们的移动应用课程中遇到了同样的问题。

我不确定问题是什么,但对我们来说,这似乎是模拟器的一个错误。 在某些Linux机器上,OnCompletionEvent根本没有触发。在Mac上,事件在应用程序中触发,但不在单元测试中触发。

如果在真实设备而不是模拟器上执行,则(应用程序和单元测试)都能正常工作。

我们使用的AVD是三星Galaxy Tab(android2.2 api8)

答案 5 :(得分:0)

使用更新的Android版本(从8 Oreo开始),可能是由于应用程序进入睡眠状态而导致出现问题。这就是在我的应用中的原因。播放一首歌后就睡着了。

您可以检查并更改Android电池设置:
1.电池优化
2.点击“未优化”,然后点击“所有应用”
3.查找您的应用,并将设置更改为“未优化”

答案 6 :(得分:-1)

呀。我确认问题确实发生在某些设备上。我最新的Android手机遇到了这个问题,但不是旧问题。

除非您使用流式音频源,否则可以将mMediaPlayer.setOnCompletionListener(...)替换为

new Timer().schedule(new TimerTask() {
  @Override
    public void run() {
      actionWhenAudioEndIsReached();
    }
  }, mMediaPlayer.getDuration());

它应该工作:)