我正在创建一个Java Fx媒体播放器,而且我在管理应用程序内存方面遇到了很多问题。
问题是:当您需要多个媒体(视频或音频)时,每次必须播放新媒体时都必须创建一个新的MediaPlayer。
在一些循环之后,您将收到错误:Java 7(OutOfMemory)或Java 8(mmap()失败:无法分配内存。)
发生这种情况是因为他们没有说你必须在创建一个新的MediaPlayer之前隐式调用dispose()方法。
答案 0 :(得分:4)
一个简单而功能齐全的例子:
(这是我对社区的小贡献,希望这有助于某人)
import java.io.File;
import javafx.application.Application;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.stage.Stage;
public class MediaPlayerSample extends Application {
private File[] files;
private int nextIdx;
private MediaPlayer activePlayer;
public static void main(String[] args) {
launch(args);
}
private void playNext() {
if (files == null || files.length == 0) {
return;
}
Media media = new Media(files[nextIdx++].toURI().toString());
if (nextIdx >= files.length) {
nextIdx = 0;
}
if (activePlayer != null) {
activePlayer.stop();
// This is the magic code
activePlayer.dispose();
}
activePlayer = new MediaPlayer(media);
activePlayer.setOnEndOfMedia(new Runnable() {
@Override
public void run() {
playNext();
}
});
activePlayer.play();
}
@Override
public void start(Stage primaryStage) throws Exception {
File fDir = new File("/mp3-files/");
files = fDir.listFiles();
playNext();
}
}