2014-11-23 4 views
3

На самом деле это не вопрос, это решение. Я создаю медиа-плеер Java Fx, и у меня возникло множество проблем для управления памятью приложения. После много времени и исследований я нашел сообщение с разрешением.SOLVED - JavaFx MediaPlayer - не может выделить память или OutOfMemory

Проблема: когда у вас есть много медийных средств (видео или аудио), вам необходимо создать новый MediaPlayer каждый раз, когда вам придется играть в новый.

После некоторых циклов вы получите сообщение об ошибке: Java 7 (OutOfMemory) или Java 8 (mmap() не удалось: невозможно выделить память).

Это происходит потому, что нигде они не говорят, что вам нужно замаскировать вызов метода dispose() из последнего созданного MediaPlayer, прежде чем создавать новый.

TIP Reference

ответ

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

} 
+0

Я зову videoPlayer.stop() и videoPlayer.dispose(), но до н.э. вообще не будет выпускать ressource. –

Смежные вопросы