2017-12-15 20 views
0

Java 8が正しくインストールされており、それがOracleバージョン(OpenJDKではなく)です。私のIDEはEclipseです。私はJavaFXのプロジェクトに次のコードを実行すると、JavaFXメディアプレーヤーがクラッシュするのはなぜですか?

import java.io.File; 
import javafx.embed.swing.JFXPanel; 
import javafx.scene.media.Media; 
import javafx.scene.media.MediaPlayer; 

public class TestPlayer { 
    static JFXPanel fxPanel =new JFXPanel(); 
    private Media song; 
    private MediaPlayer mediaPlayer ; 
    public TestPlayer(String filePath) { 
     song=new Media(new File(filePath).toURI().toString()); 
     mediaPlayer = new MediaPlayer(song); 
    } 

    public void play() { 
     this.mediaPlayer.play(); 
    } 
    public static void main(String[] args) { 
     new TestPlayer("song\\1.mp3").play(); 
    } 
} 

mediaPlayerにのみ、その後は音なし例外がスローされません、数秒間、曲を再生することができます。

は、その後、私は

private static Media song; 

private Media song; 

から8行目を変更し、変更されたコードが正常に実行されました。

問題は解決しましたが、理由を知りたい。これらの2次のスクリーンショットは、変更前のEclipse

のデバッグモードで撮影されています enter image description here

変更後: after modification

の違いは、 "JFXMediaプレーヤーEventQueueThread" です。

+0

'static'を追加することは、正しい修正であるとは考えにくいでしょう。クラッシュしたときからスタックトレースを投稿できますか? –

+0

静的を追加すると、インスタンスが作成されましたか。 –

+1

ここで 'static 'を追加することで違いは、' Media'インスタンスがスコープから外れるのを防ぐことです。私は、実際にメディアを再生しているスレッドは弱い参照しか保持していないと思います。実際のアプリケーションでは、これは明らかに問題ではありません。 –

答えて

0

メディアプレーヤーのスレッド - JFXMedia Player EventQueueThreadのガベージコレクションの問題があります。 Iv'eはVisualVMを使ってスレッドとGCを監視しました。

コードではMediaPlayerが開始され、返され、インスタンス参照はGCの対象となります。ここで私は、GCを余儀なくされています(6時44分57秒で)起動後数秒:

enter image description here

JFXMedia Player EventQueueThreadが停止し、同時に:

enter image description here

することによりMediaまたはMediaPlayerstaticあなたはクラスインスタンスではなくクラスローダにバインドしているため、コレクションに適格ではありません。一般的に、JavaFXクラスを使用する場合は、Applicationをサブクラス化する必要があります。クラスのJavaDocの状態:

のJavaFXをスレッドアプリケーションは入力イベントを処理し、 方法を開始し、アニメーションタイムラインを実行している実行するためのアプリケーション・スレッドを作成します。

Javaランチャーは、指定されたアプリケーション クラスをJavaFXアプリケーションスレッドにロードして初期化します。メインメソッドが Applicationクラスに存在しない場合、またはメインメソッドが Application.launch()を呼び出す場合、JavaFXアプリケーションスレッドには が作成されます。

このようにコードを実行すると、GCはJFXMedia Player EventQueueThreadを収集できません。繰り返しますが、私は

enter image description here

(7時19分04秒で)GCを開始し、現在のスレッドがまだ生きている:mainスレッドが一緒にそこにもあることを

enter image description here

お知らせJavaFX-Launcher

真の深い分析のためには、ヒープダンプを検査する必要がありますが、この洞察は問題の範囲で十分です。

関連する問題