Android一个MediaPlayer实例 – 单例

我即将创建简单的Android应用程序,以便在单击按钮时播放声音,但我很难理解单例设计模式,这在此应用程序中非常有用.我尝试实现的是拥有多个活动并且只共享一个MediaPlayer实例,以便用户按下按钮声音播放,如果他将按相同或不同的活动按相同或另一个按钮,声音将停止.

这是我的代码,但按下按钮两次后,另一个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();
}
}

因为我不是很有经验你可以除了上面代码的提示解释我如何访问单身的字段.我不确定我的方法是否正确.如果我有单例类,我想使用这个MediaPlayer实例,我该怎么做?

谢谢!

解决方法:

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

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

因为您已经为MyMediaPlayer类创建了单例类,当播放器已经可用时,它会避免创建新对象.但每次都会初始化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();
上一篇:java – 通知单独的JVM以执行任务


下一篇:从三种单例模式的比较中了解volatile的真相