java - 我应该如何只创建一次媒体播放器并多次调用它?

标签 java

所以我正在开发一款小型手机游戏,当我点击按钮时,它应该播放声音效果。我希望它在短时间内播放多个实例,因此 SoundPool 在我的情况下不起作用。 目前我正在使用这个方法

public void playTapSound(){
        final MediaPlayer gameSound = MediaPlayer.create(this, R.raw.tapsound);
        gameSound.start();
    }

但是,我不会在任何地方调用 gameSound.release,因为我不确定在哪里调用它。因此,在使用 40 次后,声音可能会停止播放,因为创建的 MediaPlayer 过多。

我尝试放置

final MediaPlayer gameSound = MediaPlayer.create(this, R.raw.tapsound);

进入 onCreate(),但是当我这样做时,gameSound 会出现错误,提示“无法解析符号‘gameSound’”。

如果我将它放在 onCreate() 之前或之后,应用程序就会崩溃,因为“this”为 null。

当点击一个按钮时,还有一些其他的东西,然后我也会运行

    public void tapped(View view) {
        if (!buttons[0].isAllCaps()) {
            playTapSound();
            buttons[0].setBackgroundColor(Color.parseColor("#1fab89"));
            buttons[0].setAllCaps(true);
            score++;
            x++;
            points.setText(String.valueOf(score));
        }
        else {
            buttons[0].setBackgroundColor(Color.parseColor("#505bda"));
            lose(score);
        }
    }

希望我能获得一些有关在何处放置 gameSound.release() 或如何在 onCreate() 创建玩家时调用 gameSound 的帮助。谢谢

最佳答案

使用怎么样Singleton pattern

public final class MediaPlayerHolder {
    private static final MediaPlayerHolder INSTANCE = new MediaPlayerHolder();

    public static MediaPlayerHolder getInstance() {
        return INSTANCE;
    }

    private MediaPlayerHolder() {
    }


    private MediaPlayer gameSound;

    // get with required parameters
    public MediaPlayer get(...) {
        if(mediaPlayer == null)
            gameSound = MediaPlayer.create(...);
        return gameSound;
    }

}

public void playTapSound(){
    MediaPlayerHolder.getInstance().get().start();
}

关于java - 我应该如何只创建一次媒体播放器并多次调用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58047047/

相关文章:

java - GroovyCast异常 : Cannot cast object 'class com.jcraft.jsch.ChannelExec' with class 'java.lang.Class' to class

java - 修改 URI 的端口

java - 使用 Google App Engine 的网络服务

java - Docker 设置

java - 用于 ssm 的 aws java sdk 给出 java.lang.NoSuchFieldError : SIGNING_REGION

java - 域类中的值占位符

java - java android 中的转换(ArrayList)

java - 用新的 AlphaAnimation 覆盖 Dialog dismiss()

java - 没有 ABAP Workbench 的 SAP 编程

java - 阻止 libgdx TextButton 根据文本更改大小