如何从Media检索元数据并使其余的代码等待加载完成?

时间:2019-01-09 23:35:25

标签: java javafx metadata listener media

我正在尝试从歌曲中检索元数据。

我创建了一个名为Song的类,其中有一个基本的构造函数,很多吸气剂,例如“ getTitle()”或“ getArtist()”等等……

要实际获取此信息,我将必须运行一个名为applyProperties()的方法。该方法遍历所有元数据,并将它们放入实例变量中,但以其自身的速度和线程进行。有时,当我调用getter时,输出仅为null,这可能是因为它在第一个方法分配值之前获取了数据。只是我在猜...

它是这样的:

two muppets

这时,实例变量应该已经使用String进行了初始化,以便能够查看有关歌曲文件的信息。但是它们并不同步。

我要执行的是使applyProperties()运行,并且在完全完成元数据检索之前,不要让任何其他代码继续运行。这样,在元数据准备就绪之前,我不必冒险运行吸气剂。

这是Song类:

public Song(String fileName, MapChangeListener mapChangeListener) {

    // The path to the selected song
    String path = new File("src/sample/media/" + fileName).getAbsolutePath();

    // Adding the path to the media
    media = new Media(new File(path).toURI().toString());


 //  media.getMetadata().addListener(mapChangeListener);

}

public Song (String fileName){

    // The path to the selected song
    String path = new File("src/sample/media/" + fileName).getAbsolutePath();

    // Adding the path to the media
    media = new Media(new File(path).toURI().toString());


}


public String getSongTitle() {

    return songTitle;

}

public String getSongArtist() {

    return songArtist;
}

public String getSongAlbum() {

    return songAlbum;
}

public Media getMedia() {
    return media;
}

public void applyProperties() {


    System.out.println("Applying properties..");


    ObservableMap<String,Object> meta_data=media.getMetadata();

    meta_data.addListener(new MapChangeListener<String,Object>(){
        @Override
        public void onChanged(Change<? extends String, ? extends Object> ch) {

            if(ch.wasAdded()){

                String key=ch.getKey();
                Object value=ch.getValueAdded();

                switch(key){
                    case "album":
                        songAlbum = value.toString();
                      //  System.out.println(value.toString());
                        break;
                    case "artist":
                        songArtist = value.toString();
                      //  System.out.println(value.toString());
                        break;
                    case "title":
                        songTitle = value.toString();
                      //  System.out.println(value.toString());
                        doneSearching=true;
                        break;


                }
            }
        }



    });




}

0 个答案:

没有答案