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



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

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

但是,我不在任何地方调用gameSound.release,因为我不确定在哪里称呼它。因此,在使用 40 次后,声音停止播放可能是由于创建了太多媒体播放器。

我试过放置

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

到 onCreate((,但是当我这样做时,gameSound 变成了一个错误,说"无法解析符号'gameSound'"。

如果我把它放在onCreate((之前或之后,应用程序就会崩溃,因为"this"为空。

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

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的帮助。

使用单例模式怎么样?

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();
}
gameSound

在两次尝试中都成为局部变量。首先,它是playTapSound()本地的,因此无法从其他任何地方访问,其次它是onCreate()本地的,因此甚至无法从playTapSound()访问。
而是在方法之外创建一个对象级变量(因此可供所有方法使用(:

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

(但是我不知道它是否会运行,这个建议侧重于编译+可见性问题,我不知道是否可以多次调用start()- 也许是的,也许你可以简单地在开始前立即停止,也许你必须跟踪它是否仍在播放,并且只有在那种情况下才停止它(。

(旁注:final使变量在初始化后不可修改。它与在方法之间共享变量无关,此处不需要它。

最新更新