【问题标题】:Java. How to redefine onCompletion method of a MediaPlayer instance爪哇。如何重新定义 MediaPlayer 实例的 onCompletion 方法
【发布时间】:2016-12-28 08:05:35
【问题描述】:

我有一个MediaPlayer 实例mPlayer

mPlayer的戏演完了,我想做点动作。我已经看到这是通过接口OnCompletionListener的方法onCompletion完成的。

如何为我的mPlayer 实例重新定义此方法?

编辑:

我已经创建了我的 API AudioPlayer。

import android.media.MediaPlayer;

import java.io.IOException;

public class AudioPlayer {

    public MediaPlayer mPlayer = new MediaPlayer();

    public AudioPlayer(String source, boolean loop) {
        configurePlayer(source, loop);
    }

    private void configurePlayer(String source, boolean loop) {
        try {
            mPlayer.reset();
            mPlayer.setDataSource(source);
            mPlayer.setLooping(loop);
            mPlayer.prepare();
        } catch (IOException e) { }
    }

    public void startPlaying() {
        mPlayer.start();
    }

    public void stopPlaying() {
        mPlayer.stop();
    }
}

现在我有各种音频播放器。但我一次只想要一场比赛。因此,我已经实现了互斥(不完全是,但对于我的应用来说已经足够了)。

boolean token = true;

public void onClick(View v) {
    if (token) {
        token = false;
        mPlayer.startPlaying();
    }
}

现在我希望在播放结束时返回令牌。类似的东西

onCompletion() {
    token = true;
}

【问题讨论】:

  • 到目前为止你做了什么,向我们展示你的MediaPlayer 以及你需要对OnCompletionListener 采取什么行动。
  • @Stanojkovic 完成!问题已编辑
  • mPlayer.setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { // TODO 自动生成的方法存根 mPlayer.release(); token = true; }

标签: java android interface android-mediaplayer abstract-class


【解决方案1】:

您可以尝试执行以下操作:

  1. 修改你的类声明以实现OnCompletionListener

  2. 实现监听器的onCompletion()方法;

  3. 将当前类设置为mPlayerOnCompletionListener

这里是修改后的代码sn-p:

public class AudioPlayer implements MediaPlayer.OnCompletionListener { // 1

    public MediaPlayer mPlayer = new MediaPlayer();

    public AudioPlayer(String source, boolean loop) {
        configurePlayer(source, loop);
        mPlayer.setOnCompletionListener(this); // 3
    }

    @Override
    public void onCompletion(MediaPlayer mediaPlayer) { // 2
        token = true;
    }

    /* the other class implementation */
} 

希望这会有所帮助:)

【讨论】:

  • 好的!而且我不希望 AudioPlayer 的所有实例都覆盖onCompletion。因此,AudioPlayer 构造函数的第三个布尔参数override 会很好,然后if (override),做setOnCompletionListener
  • 是的,作为一个选项。当然,您可以在构造函数mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mediaPlayer) { token = true; } }); 中与if(override) 子句一起使用,而不是在类声明中指定OnCompletionListener
【解决方案2】:

也许尝试扩展 MediaPlayer 类,然后覆盖你想使用 super() 重新定义的方法

【讨论】:

  • 我不希望 AudioPlayer 的所有实例都覆盖该方法。
猜你喜欢
  • 1970-01-01
  • 2012-10-07
  • 1970-01-01
  • 2011-05-20
  • 2015-07-30
  • 2015-02-05
  • 1970-01-01
  • 1970-01-01
  • 2013-06-15
相关资源
最近更新 更多