代号一音 Media.play() 内存泄漏?
Codename One sound Media.play() memory leak?
我的应用程序使用一些短音作为用户反馈。我使用以下代码:
private void playSound(String fileName) {
try {
FileSystemStorage fss = FileSystemStorage.getInstance();
String sep = fss.getFileSystemSeparator() + "";
String soundDir; // sounds must be in a directory
if (fss.getAppHomePath().endsWith(sep)) {
soundDir = fss.getAppHomePath() + "sounds"; // device
} else {
soundDir = fss.getAppHomePath() + sep + "sounds"; // simulator/windows
}
if (!fss.exists(soundDir)) {
// first time a sound is played: create directory
fss.mkdir(soundDir);
}
String filePath = soundDir + sep + fileName;
if (!fss.exists(filePath)) {
// first time this sound is played: copy from resources (place file in <project>/src)
InputStream is = Display.getInstance().getResourceAsStream(getClass(), "/" + fileName);
OutputStream os = fss.openOutputStream(filePath);
com.codename1.io.Util.copy(is, os);
}
Media media = MediaManager.createMedia(filePath, false);
//media.setVolume(100);
media.play();
} catch (IOException ex) {
log("Error playing " + fileName + " " + ex.getMessage());
}
}
调用示例:
playSound("error.mp3");
这在设备和模拟器上运行良好。但是,如果我在模拟器中进行长时间的自动测试(使用 Windows),大约每秒播放一次声音,
这会耗尽所有 RAM,直到 Windows 崩溃。但是,Windows 任务管理器未显示 NetBeans 和 Java 进程的异常内存使用情况。
所以我的问题是:我的代码是否正确?这也会发生在设备上吗?或者有没有办法在 simulator/Windows?
中防止这种情况发生
P.S.
我也尝试了 中的代码。那有同样的问题,也
一些声音丢失(未播放)。
我也尝试了 中的简单代码,但它不起作用。
我们通常建议为此类用例保留 Media 实例。
但是,如果您不能确保在完成后调用清理:
MediaManager.addCompletionHandler(media, () -> media.cleanup());
media.play();
我的应用程序使用一些短音作为用户反馈。我使用以下代码:
private void playSound(String fileName) {
try {
FileSystemStorage fss = FileSystemStorage.getInstance();
String sep = fss.getFileSystemSeparator() + "";
String soundDir; // sounds must be in a directory
if (fss.getAppHomePath().endsWith(sep)) {
soundDir = fss.getAppHomePath() + "sounds"; // device
} else {
soundDir = fss.getAppHomePath() + sep + "sounds"; // simulator/windows
}
if (!fss.exists(soundDir)) {
// first time a sound is played: create directory
fss.mkdir(soundDir);
}
String filePath = soundDir + sep + fileName;
if (!fss.exists(filePath)) {
// first time this sound is played: copy from resources (place file in <project>/src)
InputStream is = Display.getInstance().getResourceAsStream(getClass(), "/" + fileName);
OutputStream os = fss.openOutputStream(filePath);
com.codename1.io.Util.copy(is, os);
}
Media media = MediaManager.createMedia(filePath, false);
//media.setVolume(100);
media.play();
} catch (IOException ex) {
log("Error playing " + fileName + " " + ex.getMessage());
}
}
调用示例:
playSound("error.mp3");
这在设备和模拟器上运行良好。但是,如果我在模拟器中进行长时间的自动测试(使用 Windows),大约每秒播放一次声音, 这会耗尽所有 RAM,直到 Windows 崩溃。但是,Windows 任务管理器未显示 NetBeans 和 Java 进程的异常内存使用情况。
所以我的问题是:我的代码是否正确?这也会发生在设备上吗?或者有没有办法在 simulator/Windows?
中防止这种情况发生P.S.
我也尝试了
我也尝试了
我们通常建议为此类用例保留 Media 实例。 但是,如果您不能确保在完成后调用清理:
MediaManager.addCompletionHandler(media, () -> media.cleanup());
media.play();