Android 一个 MediaPlayer 实例 - 单例

Android one MediaPlayer instance - singleton

我正准备创建简单的 android 应用程序来在单击按钮时播放声音,但我很难理解单例设计模式,这对这个应用程序非常有帮助。我试图实现的是拥有多个活动并在其中仅共享一个 MediaPlayer 实例,以便用户按下按钮时播放声音,如果他按下相同或不同的按钮 activity,声音将停止。

这是我的代码,但在按下按钮两次后,会创建另一个 MediaPlayer 实例,您可以在这里同时播放相同的声音

public class MyMediaPlayer {
MediaPlayer mp;
private static volatile MyMediaPlayer instance = null;
private MyMediaPlayer() { }

public static MyMediaPlayer getInstance() {
    if (instance == null) {
        synchronized (MyMediaPlayer.class) {
            if (instance == null) {
                instance = new MyMediaPlayer();
            }
        }
    }

    return instance;
}
}

和MainActivity.java:

public class MainActivity extends Activity {

private MyMediaPlayer player = getInstance();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

}

public void playSound(View view){
    player.mp = MediaPlayer.create(getApplicationContext(), R.raw.sound);
    player.mp.start();
}
}

由于我不是很有经验,除了上面代码的提示之外,您能否解释一下如何访问单例的字段。我不确定我的方法是否正确。如果我有单例 class 并且我想使用这个 MediaPlayer 实例我该怎么做?

谢谢!

添加 null 检查您在 playSound 上创建的 mp 对象 单击按钮:

public void playSound(View view){
    if(player.mp==null)
      player.mp = MediaPlayer.create(getApplicationContext(), R.raw.sound);
      player.mp.start();
}

因为您已经为 MyMediaPlayer class 创建了单例 class,这避免了在 player 已经可用时创建新对象。但是 mp 每次都会初始化。

编辑: 要使用单个 MediaPlayer 播放多个声音,请执行以下操作:

if(player.mp ==null)
  player.mp = new MediaPlayer();
else
  player.mp.reset();
String fileName="android.resource://"+getPackageName()+
                                               "/"+ R.raw.sound;
player.mp.setDataSource(getApplicationContext(),Uri.parse(fileName));
player.mp.prepare();
player.mp.start();
You can do this :


public class MainActivity extends Activity {



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


}

public void playSound(View view){
    MyMediaPlayer.getInstance().create(getApplicationContext(), R.raw.sound).start();

}
public void stopSound(View view){
    MyMediaPlayer.getInstance().stop();

}

}