我是Java编程的新手,我正在尝试开发一个可以从导入的MP3文件中检索媒体标签(例如 Headers ,艺术家......)的类,这样我就可以将它们存储在个人MySQL中数据库 .
我有这个问题,我一直试图解决几天,但我无法在网上找到解决方案 .
这是我的 class :
public class FileImportClass extends Application {
private static final Object obj = new Object();
private static List<File> songList;
private static ArrayList<String> title;
private static ArrayList<String> artist;
private static ArrayList<Integer> year;
private static ArrayList<String> genre;
private static ArrayList<String> duration;
private static ArrayList<String> album;
private static ArrayList<String> extension;
private static ArrayList<String> size;
private static ObservableMap<String, Object> songTags;
public static void FileImport(Node node){
title = new ArrayList<>();
artist = new ArrayList<>();
year = new ArrayList<>();
genre = new ArrayList<>();
duration = new ArrayList<>();
album = new ArrayList<>();
extension = new ArrayList<>();
size = new ArrayList<>();
FileChooser fileImport = new FileChooser();
fileImport.setTitle("Importazione di File Audio");
fileImport.getExtensionFilters().addAll(new ExtensionFilter("MP3 Files: ", "*.mp3"));
Stage currentStage = (Stage) node.getScene().getWindow();
songList = fileImport.showOpenMultipleDialog(currentStage);
if (songList.size() > 50) {
Alert alert = new Alert(Alert.AlertType.ERROR);
alert.setTitle("Errore!");
alert.setHeaderText("Errore nell'inserimento dei file audio!");
alert.setContentText("È stato superato il massimo di 50 file audio importabili alla volta.");
alert.showAndWait();
return;
}
else{
for(int i = 0; i < songList.size(); i++) {
File file = songList.get(i);
Media mediaFile = new Media(file.toURI().toString());
double FILE_SIZE_D = file.length();
int FILE_SIZE_I = (int) FILE_SIZE_D;
int FILE_SIZE = FILE_SIZE_I / 1024;
size.add(String.valueOf(FILE_SIZE) + " kB");
final MediaPlayer mediaPlayer = new MediaPlayer(mediaFile);
mediaPlayer.setOnReady(new Runnable(){
@Override
public void run() {
songTags = mediaPlayer.getMedia().getMetadata();
title.add(songTags.get("title").toString());
artist.add(songTags.get("artist").toString());
double DURATA_MINUTI_D = mediaFile.getDuration().toSeconds() / 60;
double DURATA_MINUTI_I = (int) DURATA_MINUTI_D;
double DURATA_SECONDI_D = (DURATA_MINUTI_D - DURATA_MINUTI_I) * 60;
double DURATA_SECONDI_I = (int) DURATA_SECONDI_D;
duration.add(String.valueOf(DURATA_MINUTI_I) + " min " + DURATA_SECONDI_I + " s");
if (songTags.get("genre") != null) {
genre.add(songTags.get("genre").toString());
}
else {
genre.add("Genere sconosciuto");
}
if (songTags.get("album") != null) {
album.add(songTags.get("album").toString());
}
else {
album.add("Album sconosciuto");
}
year.add((Integer) songTags.get("year"));
synchronized(obj){
obj.notify();
}
}
});
}
}
System.out.println(title);
System.out.println(artist);
System.out.println(genre);
System.out.println(size);
System.out.println(duration);
System.out.println(album);
System.out.println(year);
}
@Override
public void start(Stage primaryStage) throws Exception {
throw new UnsupportedOperationException("Not supported yet.");
}
}
问题是,当我尝试打印包含Tags的ArrayLists时,它们是空的(“[]”) . 但是,如果我尝试从mediaPlayer.setOnReady()函数内部打印它们,那么它可以正常工作 .
有没有人可以帮我解决这个问题?
谢谢大家!
2 回答
你're adding the tags inside ' MediaPlayer.setOnReady',当
MediaPlayer
对象的状态变为READY
时被调用 . 调用方法后但在未知时间之后不会立即发生这种情况 . 这意味着你的print语句被执行 before 状态改变事件,所以那时列表仍然是空的 .正如Gnas所说,这里存在同步性问题 . 你必须做这样的事情:
在你的循环中:
在run()方法结束时: