android 玩家玩了大约 30 次然后停止
android player plays about 30 times and stops
以下连续播放约30次后停止播放。 (程序继续 运行。)我读到我可能创建了太多播放器实例。我如何修改此代码以防止这种情况发生?
(此代码已根据建议进行了编辑,但仍然只播放了大约 30 次。)
public static MediaPlayer m;
private void playboopboop(String fileName) {
try {
AssetFileDescriptor d = getAssets().openFd(fileName);
long start = d.getStartOffset();
long end = d.getLength();
this.m = new MediaPlayer();
this.m.setDataSource(d.getFileDescriptor(), start, end);
this.m.setLooping(false);
this.m.prepare();
this.m.start();
} catch (Exception e) {
doalert("Audio Error: " + e);
}
}
在函数外部创建媒体播放器并将其作为变量传递到函数中,或者如果您在 class 中则引用它。这将帮助您避免不小心创建太多实例。您还应该将循环设置为 false。如果循环为真,那么一旦文件完成,它将再次开始。例如:
private void playboopboop(String fileName, MediaPlayer m) {
try {
AssetFileDescriptor d = getAssets().openFd(fileName);
long start = d.getStartOffset();
long end = d.getLength();
m.setDataSource(d.getFileDescriptor(), start, end);
m.setLooping(false);
m.prepare();
m.start();
} catch (Exception e) {
doalert("Audio Error: " + e);
}
}
或者像这样:
//Defined in the class you are using
public MediaPlayer m = new MediaPlayer();
private void playboopboop(String fileName) {
try {
AssetFileDescriptor d = getAssets().openFd(fileName);
long start = d.getStartOffset();
long end = d.getLength();
this.m.setDataSource(d.getFileDescriptor(), start, end);
this.m.setLooping(false);
this.m.prepare();
this.m.start();
} catch (Exception e) {
doalert("Audio Error: " + e);
}
}
重置方法将停止任何媒体并将 MediaPlayer 实例发送回空闲状态,与创建时的状态相同。工作代码如下:
public MediaPlayer m = new MediaPlayer();
private void playboopboop(String fileName) {
try {
AssetFileDescriptor d = getAssets().openFd(fileName);
long start = d.getStartOffset();
long end = d.getLength();
m.reset(); // set player to initial creation state
m.setDataSource(d.getFileDescriptor(), start, end);
m.prepare();
m.start();
} catch (Exception e) {
doalert("Audio Error: " + e);
}
}
以下连续播放约30次后停止播放。 (程序继续 运行。)我读到我可能创建了太多播放器实例。我如何修改此代码以防止这种情况发生? (此代码已根据建议进行了编辑,但仍然只播放了大约 30 次。)
public static MediaPlayer m;
private void playboopboop(String fileName) {
try {
AssetFileDescriptor d = getAssets().openFd(fileName);
long start = d.getStartOffset();
long end = d.getLength();
this.m = new MediaPlayer();
this.m.setDataSource(d.getFileDescriptor(), start, end);
this.m.setLooping(false);
this.m.prepare();
this.m.start();
} catch (Exception e) {
doalert("Audio Error: " + e);
}
}
在函数外部创建媒体播放器并将其作为变量传递到函数中,或者如果您在 class 中则引用它。这将帮助您避免不小心创建太多实例。您还应该将循环设置为 false。如果循环为真,那么一旦文件完成,它将再次开始。例如:
private void playboopboop(String fileName, MediaPlayer m) {
try {
AssetFileDescriptor d = getAssets().openFd(fileName);
long start = d.getStartOffset();
long end = d.getLength();
m.setDataSource(d.getFileDescriptor(), start, end);
m.setLooping(false);
m.prepare();
m.start();
} catch (Exception e) {
doalert("Audio Error: " + e);
}
}
或者像这样:
//Defined in the class you are using
public MediaPlayer m = new MediaPlayer();
private void playboopboop(String fileName) {
try {
AssetFileDescriptor d = getAssets().openFd(fileName);
long start = d.getStartOffset();
long end = d.getLength();
this.m.setDataSource(d.getFileDescriptor(), start, end);
this.m.setLooping(false);
this.m.prepare();
this.m.start();
} catch (Exception e) {
doalert("Audio Error: " + e);
}
}
重置方法将停止任何媒体并将 MediaPlayer 实例发送回空闲状态,与创建时的状态相同。工作代码如下:
public MediaPlayer m = new MediaPlayer();
private void playboopboop(String fileName) {
try {
AssetFileDescriptor d = getAssets().openFd(fileName);
long start = d.getStartOffset();
long end = d.getLength();
m.reset(); // set player to initial creation state
m.setDataSource(d.getFileDescriptor(), start, end);
m.prepare();
m.start();
} catch (Exception e) {
doalert("Audio Error: " + e);
}
}