Как извлечь метаданные из Media и заставить остальную часть кода ждать, пока не закончится загрузка? - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь получить метаданные из песни.

Я создал класс с именем Song, в котором у меня есть базовый конструктор, множество получателей, таких как "getTitle ()" или "getArtist ()" и так далее ...

Чтобы получить эту информацию, мне нужно запустить метод applyProperties (). Этот метод просматривает все метаданные и помещает их в переменные экземпляра, но со своей скоростью и собственным потоком. И иногда, когда я вызываю метод получения, вывод просто нулевой, возможно потому, что он получает данные до того, как первый метод присвоит значения. Только я догадываюсь ...

Вот как это выглядит:

two muppets

В этот момент переменные экземпляра уже должны были быть инициализированы строкой, чтобы я мог видеть информацию о файле песни. Но они не синхронизированы.

То, что я хочу, - это запустить 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;


                }
            }
        }



    });




}
...