我是MediaPlayer,播放用户从库中选择的音乐。创建库时,歌曲需要按标题列出。我知道我可以使用Media对象获取所有元数据。但这引起了两个问题。 I)对于大型媒体收藏而言,整个过程非常耗费时间和资源 II)即使我使用以下代码
for(String path : paths){
Media m = new Media(path);
String title = (String)m.getMetadata().get("title");
String album = (String)m.get metadata().get("album");
String artist = (String)m.get metadata().get("artist");
}
虽然文件本身具有元数据,但大多数时候艺术家,标题,专辑字符串都具有空值。分析Media类我理解在获取元数据时它内部存在某种线程,这就是快速请求返回null的原因。但我不能每次都做等待(milis),因为这会耗费大量时间。有任何变通方法吗?
答案 0 :(得分:0)
来自Media文档:
媒体信息是异步获取的,因此在实例化类之后不一定立即可用。但是,如果实例已与MediaPlayer关联且该播放器已转换为MediaPlayer.Status.READY状态,则所有信息均应可用。要在添加元数据或曲目时收到通知,观察者可能会分别注册getMetadata()和getTracks()返回的集合。
因此,您可能需要添加侦听器并在侦听器中运行处理。可以直接在元数据上添加侦听器,也可以在关联播放器的状态上添加侦听器。例如:
Media media = new Media(myMediaLocationString);
media.getMetadata().addListener((MapChangeListener<String, Object>) change -> {
// code to process metadata attribute change.
});
MediaPlayer player = new MediaPlayer(media);
我没有尝试使用示例程序对此进行测试,但是,根据我对文档的理解,它应该可以工作; - )
内存使用情况。创建2000 Media对象确实冻结了显示。怎么办?
冻结和记忆消耗是不同的事情,可能是不相关的。
要防止UI线程阻塞,请不要在创建媒体对象时阻止UI线程,请使用concurrency工具。 Task文档中有许多不同场景的示例。编写并发代码时要小心,不要在活动场景图中修改任何内容(例如显示给用户)。
为了减少内存消耗,请不要及时引用您不再需要的媒体及适当dispose的媒体播放器资源。
还要考虑是否确实需要创建2000个媒体对象,或者是否最初只创建该数量的子集,并且(可能)根据需要动态创建其他对象。