我即将创建简单的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实例,我该怎么做?
谢谢!
答案 0 :(得分:4)
在null
按钮点击上添加mp
检查您正在创建的playSound
对象:
public void playSound(View view){
if(player.mp==null)
player.mp = MediaPlayer.create(getApplicationContext(), R.raw.sound);
player.mp.start();
}
因为你为MyMediaPlayer
类创建了单例类,当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();
答案 1 :(得分:1)
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();
}
}