我正在开发一个应用程序,每次按下按钮时应该发出声音,应用程序看起来像木琴,问题在于播放声音的功能。
这是我的应用程序的主要部分:
doo = (Button) findViewById(R.id.doo);
re = (Button) findViewById(R.id.re);
mi = (Button) findViewById(R.id.mi);
fa = (Button) findViewById(R.id.fa);
sol = (Button) findViewById(R.id.sol);
la = (Button) findViewById(R.id.la);
si = (Button) findViewById(R.id.si);
dom = (Button) findViewById(R.id.dom);
doo.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
MediaPlayer sound;
sound = MediaPlayer.create(Xylophone.this, R.raw.doo);
sound.start();
}
});
re.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
MediaPlayer sound;
sound = MediaPlayer.create(Xylophone.this, R.raw.re);
sound.start();
}
});
mi.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
MediaPlayer sound;
sound = MediaPlayer.create(Xylophone.this, R.raw.mi);
sound.start();
}
});
fa.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
MediaPlayer sound;
sound = MediaPlayer.create(Xylophone.this, R.raw.fa);
sound.start();
}
});
sol.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
MediaPlayer sound;
sound = MediaPlayer.create(Xylophone.this, R.raw.sol);
sound.start();
}
});
la.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
MediaPlayer sound;
sound = MediaPlayer.create(Xylophone.this, R.raw.la);
sound.start();
}
});
si.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
MediaPlayer sound;
sound = MediaPlayer.create(Xylophone.this, R.raw.si);
sound.start();
}
});
dom.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
MediaPlayer sound;
sound = MediaPlayer.create(Xylophone.this, R.raw.dom);
sound.start();
}
});
最初播放的声音没有问题,但是在屏幕上的一定数量的敲击声不再有任何声音后,我不得不重新启动应用程序以使其再次运行。
谁能告诉我为什么?
修改
我解决了用以下代码替换代码的问题:
doo.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
final MediaPlayer sound;
sound = MediaPlayer.create(Xylophone.this, R.raw.doo);
sound.setOnCompletionListener(new OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
sound.release();
}
});
sound.start();
}
});
我希望这个编辑可以帮助某人:)
答案 0 :(得分:0)
您正在创建一个新的MediaPlayer
实例来播放每个声音。 MediaPlayers是资源密集型的,当以这种方式使用时会引起问题。您应该重复使用它们或清理它们。
来自documentation of the MediaPlayer.create()
方法:
完成MediaPlayer后,您应该调用release()来释放 资源。如果没有发布,将导致过多的MediaPlayer实例 在一个例外中。
答案 1 :(得分:0)
编写代码的方式,每次按下按钮时都会创建一个新的MediaPlayer对象。随着时间的推移,您的手机将耗尽内存。
尝试在按钮定义后创建8个声音并且只有 dooSound.start(); 在单击侦听器中。 检查MediaPlayer文档以确保正确处理对象生命周期。