Java 在播放完媒体播放器后,如何释放它?
我正在制作一个音效板,点击大约30种不同的声音后,它停止工作;我相信android的内存已经用完了。下面是我的代码。如何实现.release(),以便在播放完声音后释放它?我真的不在乎两件事是否同时发生;为了实现这一点,卡子太短。我只想得到我的代码集Java 在播放完媒体播放器后,如何释放它?,java,android,release,android-mediaplayer,Java,Android,Release,Android Mediaplayer,我正在制作一个音效板,点击大约30种不同的声音后,它停止工作;我相信android的内存已经用完了。下面是我的代码。如何实现.release(),以便在播放完声音后释放它?我真的不在乎两件事是否同时发生;为了实现这一点,卡子太短。我只想得到我的代码集 public class soundPageOne extends Activity { public void onCreate(Bundle savedState) { super.onCreate(savedState
public class soundPageOne extends Activity {
public void onCreate(Bundle savedState) {
super.onCreate(savedState);
setContentView(R.layout.soundsone);
final MediaPlayer pg1 = MediaPlayer.create(this, R.raw.peter1);
Button playSound1 = (Button) this.findViewById(R.id.peter1Button);
playSound1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
pg1.start();
}
});
我已经做了很多搜索,但是由于我缺乏java/android知识,我一直无法找到任何工作。提前谢谢,如果有人还需要代码,请告诉我 创建一个类,比如使用
SoundPool
变量创建AudioPlayer
。设置构造函数以初始化AudioPlayer
对象并创建Play
方法。SoundPool对于多次播放的短音效果更好,并且不需要您发布
public class AudioPlayer {
private SoundPool sPool = new SoundPool(Integer.MAX_VALUE, AudioManager.STREAM_MUSIC, 0);
public AudioPlayer(Context c, int id){
sounds.put("1",sPool.load(c, id, 1));
}
public void play(Context c) {
sPool.play("1", 1, 1, 1, 0, 1f);
}
}
所以你的班级应该是这样的
public class soundPageOne extends Activity {
public void onCreate(Bundle savedState) {
super.onCreate(savedState);
setContentView(R.layout.soundsone);
final AudioPlayer ap = new AudioPlayer(this, R.raw.sound);
Button playSound1 = (Button) this.findViewById(R.id.peter1Button);
playSound1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ap.play();
}
});
使用
SoundPool
变量创建一个类,比如说AudioPlayer
。设置构造函数以初始化AudioPlayer
对象并创建Play
方法。SoundPool对于多次播放的短音效果更好,并且不需要您发布
public class AudioPlayer {
private SoundPool sPool = new SoundPool(Integer.MAX_VALUE, AudioManager.STREAM_MUSIC, 0);
public AudioPlayer(Context c, int id){
sounds.put("1",sPool.load(c, id, 1));
}
public void play(Context c) {
sPool.play("1", 1, 1, 1, 0, 1f);
}
}
所以你的班级应该是这样的
public class soundPageOne extends Activity {
public void onCreate(Bundle savedState) {
super.onCreate(savedState);
setContentView(R.layout.soundsone);
final AudioPlayer ap = new AudioPlayer(this, R.raw.sound);
Button playSound1 = (Button) this.findViewById(R.id.peter1Button);
playSound1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ap.play();
}
});
你能用一把吗
比如:
public class soundPageOne extends Activity implements MediaPlayer.OnCompletionListener {
public void onCreate(Bundle savedState) {
super.onCreate(savedState);
setContentView(R.layout.soundsone);
final MediaPlayer pg1 = MediaPlayer.create(this, R.raw.peter1);
//***set the listener here***
pg1.setOnCompletionListener(this);
Button playSound1 = (Button) this.findViewById(R.id.peter1Button);
playSound1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
pg1.start();
}
});
}
//***this code will be executed once the sound finishes playing***
@Override
public void onCompletion(MediaPlayer mp) {
//log messages, other things can go here
mp.release();
}
你能用一把吗
比如:
public class soundPageOne extends Activity implements MediaPlayer.OnCompletionListener {
public void onCreate(Bundle savedState) {
super.onCreate(savedState);
setContentView(R.layout.soundsone);
final MediaPlayer pg1 = MediaPlayer.create(this, R.raw.peter1);
//***set the listener here***
pg1.setOnCompletionListener(this);
Button playSound1 = (Button) this.findViewById(R.id.peter1Button);
playSound1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
pg1.start();
}
});
}
//***this code will be executed once the sound finishes playing***
@Override
public void onCompletion(MediaPlayer mp) {
//log messages, other things can go here
mp.release();
}
试试这样的 你的活动课:
public class soundPageOne extends Activity {
public void onCreate(Bundle savedState) {
super.onCreate(savedState);
setContentView(R.layout.soundsone);
final AudioPlayer pg1 = new AudioPlayer();
Button playSound1 = (Button) this.findViewById(R.id.peter1Button);
playSound1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
pg1.play(this, R.raw.sound);
}
});
}
这是另一个Java类:
public class AudioPlayer {
private MediaPlayer mPlayer;
public void stop() {
if (mPlayer != null) {
mPlayer.release();
mPlayer = null;
}
}
public void play(Context c, int sound) {
stop();
mPlayer = MediaPlayer.create(c, sound);
mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
stop();
}
});
mPlayer.start();
}
public boolean isPlaying() {
return mPlayer != null;
}
}试试这样的方法 你的活动课:
public class soundPageOne extends Activity {
public void onCreate(Bundle savedState) {
super.onCreate(savedState);
setContentView(R.layout.soundsone);
final AudioPlayer pg1 = new AudioPlayer();
Button playSound1 = (Button) this.findViewById(R.id.peter1Button);
playSound1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
pg1.play(this, R.raw.sound);
}
});
}
这是另一个Java类:
public class AudioPlayer {
private MediaPlayer mPlayer;
public void stop() {
if (mPlayer != null) {
mPlayer.release();
mPlayer = null;
}
}
public void play(Context c, int sound) {
stop();
mPlayer = MediaPlayer.create(c, sound);
mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
stop();
}
});
mPlayer.start();
}
public boolean isPlaying() {
return mPlayer != null;
}
}我留下了一条评论,但我会发布一个答案来说明我的意思 这样做的目的是,您可以使用一定数量的
MediaPlayer
实例。这样,您就永远不会超过实例的最大数量。数组应该是您期望能够听到的并发声音数的长度。如果声音是本地文件,则准备声音所需的时间几乎可以忽略不计,因此在单击处理程序中调用create
,不会导致糟糕的性能。我想,您的每个按钮都与特定的资源相关联,因此我设置了一个助手方法,以相同的方式为每个按钮创建和播放声音
public class soundPageOne extends Activity {
private MediaPlayer[] mPlayers = new MediaPlayer[2];
private int mNextPlayer = 0;
@Override
public void onCreate(Bundle savedState) {
super.onCreate(savedState);
setContentView(R.layout.soundsone);
Button playSound1 = (Button)this.findViewById(R.id.peter1Button);
playSound1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startSound(R.raw.peter1);
}
});
}
public void onDestroy() {
super.onDestroy(); // <---------------------- This needed to be there
for (int i = 0; i < mPlayers.length; ++i)
if (mPlayers[i] != null)
try {
mPlayers[i].release();
mPlayers[i] = null;
}
catch (Exception ex) {
// handle...
}
}
private void startSound(int id) {
try {
if (mPlayers[mNextPlayer] != null) {
mPlayers[mNextPlayer].release();
mPlayers[mNextPlayer] = null;
}
mPlayers[mNextPlayer] = MediaPlayer.create(this, id);
mPlayers[mNextPlayer].start();
}
catch (Exception ex) {
// handle
}
finally {
++mNextPlayer;
mNextPlayer %= mPlayers.length;
}
}
}
公共类soundPageOne扩展活动{
私有媒体播放器[]mPlayers=新媒体播放器[2];
私有int mNextPlayer=0;
@凌驾
创建公共void(Bundle savedState){
super.onCreate(savedState);
setContentView(R.layout.soundsone);
按钮播放声音1=(按钮)this.findViewById(R.id.peter1Button);
playSound1.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
startSound(R.raw.peter1);
}
});
}
公共空间{
super.ondestory();//我留下了一条评论,但我会发布一个答案来说明我的意思
我们的想法是,您可以使用一定数量的MediaPlayer
实例。这样,您就不会超过最大实例数。数组的长度应该是您希望能够听到的并发声音数的长度。如果声音是本地文件,则准备声音所需的时间长度应该是almo可以忽略不计,因此在单击处理程序中调用create
不会导致糟糕的性能。我想,您的每个按钮都与特定的资源关联,因此我设置了一个助手方法,以相同的方式为每个按钮创建和播放声音
public class soundPageOne extends Activity {
private MediaPlayer[] mPlayers = new MediaPlayer[2];
private int mNextPlayer = 0;
@Override
public void onCreate(Bundle savedState) {
super.onCreate(savedState);
setContentView(R.layout.soundsone);
Button playSound1 = (Button)this.findViewById(R.id.peter1Button);
playSound1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startSound(R.raw.peter1);
}
});
}
public void onDestroy() {
super.onDestroy(); // <---------------------- This needed to be there
for (int i = 0; i < mPlayers.length; ++i)
if (mPlayers[i] != null)
try {
mPlayers[i].release();
mPlayers[i] = null;
}
catch (Exception ex) {
// handle...
}
}
private void startSound(int id) {
try {
if (mPlayers[mNextPlayer] != null) {
mPlayers[mNextPlayer].release();
mPlayers[mNextPlayer] = null;
}
mPlayers[mNextPlayer] = MediaPlayer.create(this, id);
mPlayers[mNextPlayer].start();
}
catch (Exception ex) {
// handle
}
finally {
++mNextPlayer;
mNextPlayer %= mPlayers.length;
}
}
}
公共类soundPageOne扩展活动{
私有媒体播放器[]mPlayers=新媒体播放器[2];
私有int mNextPlayer=0;
@凌驾
创建公共void(Bundle savedState){
super.onCreate(savedState);
setContentView(R.layout.soundsone);
按钮播放声音1=(按钮)this.findViewById(R.id.peter1Button);
playSound1.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
startSound(R.raw.peter1);
}
});
}
公共空间{
super.onDestroy();//我不确定;我非常缺乏经验。我应该在我的代码中放在哪里?媒体播放器完成后,“…”是什么意思?…是什么意思(可能是日志消息?).我将编辑我的答案,使代码更充实一些…我想这就是它的目的。我真的不想做任何其他事情(至少我不想做)。我只是厌倦了用媒体播放器重载我的应用程序,我需要一种方法来结束它们。但是,是的,我只是不知道在我的代码中放在哪里,或者在代码中更改什么,或者是否有必要对所有按钮重复。很抱歉我的无知,感谢所有的帮助@psyren89OK,这样就可以了,但是一旦我尝试再次播放按钮,它就会崩溃soundPageOne类。我试图在发布后重置,但没有效果。有什么想法吗?@psyren89将您的媒体播放器创建代码(最终的媒体播放器pg1…和pg1.setOnCompletion…)移动到onClick()方法中。我不确定;我非常缺乏经验。我应该在代码中尝试将其放在哪里?以及“…”是什么for?…是指媒体播放器播放完毕后,您想执行的任何其他代码(可能是日志消息?)。我将编辑我的答案以充实代码……我想这就是它的目的。我真的不想做任何其他事情(至少我不想做)。我只是厌倦了用媒体播放器重载我的应用程序,我需要一种方法来结束它们。但是,是的,我只是不知道在我的代码中放在哪里,或者在代码中更改什么,或者是否有必要对所有按钮重复。很抱歉我的无知,感谢所有的帮助@psyren89OK,这样就可以了,但是一旦我尝试再次播放按钮,它就会崩溃soundPageOne类。我试图在释放后重置,但