我一直在开发自己的Android音乐播放器(学习在android中编程)。
我的问题是,当应用程序第一次启动时,它会要求用户选择要扫描文件的媒体文件夹。一切都很好,但我在文件夹中有大约1200首歌曲,扫描大约需要3分钟才能完成。扫描涉及的步骤是从文件夹递归获取文件,我将每首歌曲的完整路径添加到arraylist。然后将arraylist中的每个项目添加到数据库中。我添加到数据库的字段是路径,歌曲的标题(我使用MediaMetadataReader检索),艺术家,专辑和唯一ID。
有更好的方法吗?有什么办法优化这个?提前谢谢。
编辑:
当我第一次运行任何其他音乐播放器时,它们的库包含我拥有的所有歌曲和元数据。他们的扫描只需要几秒钟。他们是怎么做到的?我做错了什么?
答案 0 :(得分:3)
当你的应用程序第一次被分配了一个媒体文件夹时,你按照你正在做的方式遍历所有文件并仅获取路径,
File dir = new File(dirPath);
File[] filelist = dir.listFiles();
然后在同一文件夹中创建XML文件,其中包含与您的应用程序关联的唯一名称或ID。
<Songs>
<song>
<name></name>
<thumbnailpath></thumbnailpath>
<filepath></filepth>
</song>
</Songs>
下次用户选择您检查的任何文件夹时,您是否创建了列出的xml文件?如果没有,则创建for和将来只使用xml文件作为表的源。
然而,技巧部分是当用户更改媒体时让我们说他们添加了新内容然后你必须编写一个逻辑来处理它。
好吧,我没有,但谷歌总是在那里哈哈。但我记得告诉你的另一件事是。让用户创建播放列表会更聪明,没有人喜欢一起浏览1200首歌曲,但是将列表分成几个不同的播放列表,这样可以让你的算法更快地遍历少量文件:)
答案 1 :(得分:1)
虽然Craftero的回答是正确的,但我建议您不要使用XML文件来序列化文件系统的内容,而是使用SQLite数据库来缓存目录的内容。这将是一个足够灵活的解决方案,您可以安排后台服务偶尔更新数据库以查找新歌曲(或在应用程序打开时手动启动新扫描)。这使您可以充分利用这两个方面,您可以最初快速显示到目前为止找到的所有内容(第一次运行应用程序除外),然后使用新的更新数据库(以及相应的视图)你找到的文件。请注意,您可能不希望在Android数组中保留1200首歌曲,这似乎是应用程序的相当大的内存,具体取决于用于表示歌曲的数据结构。