JavaFx MediaPlayer - 无法分配内存或OutOfMemory

时间:2014-11-23 23:22:48

标签: java javafx-2 media-player javafx-8

我正在创建一个Java Fx媒体播放器,而且我在管理应用程序内存方面遇到了很多问题。

问题是:当您需要多个媒体(视频或音频)时,每次必须播放新媒体时都必须创建一个新的MediaPlayer。

在一些循环之后,您将收到错误:Java 7(OutOfMemory)或Java 8(mmap()失败:无法分配内存。)

发生这种情况是因为他们没有说你必须在创建一个新的MediaPlayer之前隐式调用dispose()方法。

TIP Reference

1 个答案:

答案 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();
    }

}