java - 在Java中递归添加文件-速度问题

标签 java android optimization

首先 - 我还没有太多的 Java 经验,而且在 Android SDK 方面我还是个初学者。

我正在尝试编写一个音乐播放器应用程序,该应用程序启动时会扫描整个 SD 卡中的 mp3 文件。

目前我正在这样做:

// Recursively add songs in a directory
public void addSongsInDirectory(File dir, String filter) {
    File[] files = dir.listFiles();
    if (files != null) {
        for  (File f : files) {
            if (f.isDirectory()) {
                addSongsInDirectory(f, filter);
            } else {
                // Create new MimetypesFileTypeMap
                MimetypesFileTypeMap mtfm = new MimetypesFileTypeMap();
                // Add the mp3 mimetype
                mtfm.addMimeTypes("audio/mpeg mp3");

                // If current song is audio/mpeg, add it to the list
                if (mtfm.getContentType(f).equals(filter)) {
                    songs.add(f.getName());
                }
            }
        }
    }
}

不幸的是,在我的手机上有很多歌曲,这个过程大约需要 30 秒。我怎样才能优化这个函数,使其运行得更快(并且可能在后台运行)?

最佳答案

Android 特定的优化是在目录中查找名为 .nomedia 的文件。这表明该目录的任何子目录中都没有媒体文件。这个想法是,应用程序可以在其数据目录中创建一个 .nomedia 文件,以告诉媒体应用程序无需扫描它们,因为其中没有媒体(或者可能存在仅使用的媒体文件)由应用程序内部执行,例如游戏中的音乐)。

或者,您可以跳过编写自己的扫描仪并使用 Android 内置的媒体扫描仪。这只是一个querying the appropriate ContentProvider的问题。

您的代码将如下所示:

String[] projection = new String[] {
    MediaStore.Audio.Media.ALBUM,
    MediaStore.Audio.Media.ARTIST,
    MediaStore.Audio.Media.TITLE
};

Cursor cursor = managedQuery(
    MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, //URI
    projection, //columns to return
    null, //rows to return -  all
    null, //selection arguments - none
    null // sort order - default
);

cursor.moveToFirst();

while(! cursor.isLast()) {
    Log.d("MediaTest","Found track:");
    Log.d("MediaTest","Album " + cursor.getString(0));
    Log.d("MediaTest","Artist " + cursor.getString(1));
    Log.d("MediaTest","Track " + cursor.getString(2));
    cursor.moveToNext();
}

关于java - 在Java中递归添加文件-速度问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3289649/

相关文章:

java - jdbc.ConnectionImpl.buildCollat​​ionMapping 抛出 ClassCastException

java - 如何求函数值域?

android - 在 Google map 上显示多个标记

java - 二维数组中最常见的元素,如何优化?

用于物联网监控、优化和系统模拟的 Node.js

php - 在第一行之后停止 MySQL 查询

java - 测试 applicationContext : org. springframework.core.annotation.AnnotationUtils.getAnnotationAttributes

java - Swing 组件如何考虑我的默认区域设置?

android - 在 Android 应用程序中检测互联网连接?

android - 需要知道什么时候是新的一天,即时间是 00 :00:00