我准备创建一个简单的android应用程序,通过点击按钮来播放声音,但是我很难理解singleton设计模式,这对这个应用程序非常有帮助。我试图实现的是拥有多个活动,并且只在其中共享一个mediaplayer实例,这样当用户按下按钮sound plays时,如果他在相同或不同的活动上按下相同或另一个按钮,声音将停止。
这是我的代码,但按两次按钮后,会创建另一个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();
}
}

由于我不是很有经验,你能不能在上面的代码提示之外,解释一下我如何访问一个单例字段。我不确定我的方法是否正确。如果我有singleton类,我想使用这个mediaplayer实例,我该怎么做?
谢谢!

最佳答案

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

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

因为您已经为MyMediaPlayer类创建了singleton类,在player已经可用时避免创建新对象。但每次都会初始化mp
编辑:
要使用单个媒体播放器播放多个声音,请执行以下操作:
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();

09-10 03:28
查看更多