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);
    }
}