Как получить количество файлов в определенной папке в активах? - PullRequest
4 голосов
/ 07 ноября 2011

Мой метод слишком медленный. Результат в 265 файлах дает мне 14 секунд.

Метод

private void assetFilesAmount(String path) {
    AssetManager assetManager = getAssets();
    String assets[] = null;
    try {
        assets = assetManager.list(path);
        if (assets.length == 0) {
            filesAmount++;              
        } else {
            for (int i = 0; i < assets.length; ++i) {
                assetFilesAmount(path + "/" + assets[i]);
            }
        }
    } catch (IOException ex) {
        Log.e("tag", "I/O Exception", ex);
    }
}

Ответы [ 2 ]

4 голосов
/ 28 декабря 2011

Недавно я столкнулся с той же проблемой (я хотел скопировать некоторые файлы из каталога активов), и это было в приложении, где ожидание в несколько секунд просто не могло ее сократить.AssetManager.list () слишком медленный.Поэтому я придумала решение, оно уродливое, но быстрое.

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

somedir/somefile.txt
somedir/anotherdir/anotherfile.txt
somedir/anotherdir/yetanotherfile.txt
somedir/anotherdir/somanyfiles.txt
...

Таким образом, он загружает этот список, а затем перебирает список, вместо того, чтобы вызывать AssetManager.list ();

Это не красиво и не изящно, и, вероятно,нарушает все виды практики кодирования, но в моем случае это заняло операцию от 30 секунд до 300 миллисекунд, поэтому в моем случае это того стоило.

Если ваша папка ресурсов сильно меняется, и это будетБольно вручную обновлять список, вы, вероятно, могли бы поместить скрипт в процесс сборки, чем автоматически сделать этот файл списка каталогов для вас при сборке.

0 голосов
/ 07 ноября 2011

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

...