2014-11-23 84 views
3

其實這不是問題,它是一個解決方案。 我正在創建一個Java Fx Media Player,並且我一直有很多問題來管理應用程序內存。 經過大量時間和研究後,我找到了解決方案的帖子。已解決 - JavaFx MediaPlayer - 無法分配內存或OutOfMemory

問題是:當您需要很多媒體(視頻或音頻)時,每次必須播放新媒體時都必須創建一個新MediaPlayer。

經過一些循環之後,您將看到一個錯誤:Java 7(OutOfMemory)或Java 8(mmap()失敗:無法分配內存)。

發生這種情況是因爲無處不在,他們說你必須隱式地調用最後創建的MediaPlayer的dispose()方法,然後再創建一個新的。

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 ()但BC不會給予資源免費。 – 2017-09-07 08:54:09