如何获取assets文件夹中特定文件数量?

4

我的方法太慢了。在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);
    }
}

可能不会有太大的区别,但是尝试传递AssetManager而不是每次调用'getAssets()'。不确定该方法在做什么。 - Kevin Galligan
我把 AssetManager assetManager = getAssets(); 移到了类的顶部,但速度并没有改变很多。仍然是 13秒 - Sviatoslav
之后我不确定你能优化多少。有没有办法知道“资产”实际上是一个文件夹?我认为对于每个叶子资产调用“list”可能会很痛苦。 - Kevin Galligan
2个回答

4
我最近遇到了同样的问题(我想从assets目录中复制一些文件),而且在应用程序中有几秒钟的等待时间是不够的。AssetManager.list() 太慢了。所以我想出了一个解决办法,虽然很丑陋但是很快。
至少在我的情况下,由于assets文件夹是随着应用程序构建的,我不经常更改它。因此,我想出的解决方案是在assets目录中包含一个列出所有assets文件的文件。例如:
somedir/somefile.txt
somedir/anotherdir/anotherfile.txt
somedir/anotherdir/yetanotherfile.txt
somedir/anotherdir/somanyfiles.txt
...

所以它加载这个列表,然后循环遍历列表,而不是必须调用AssetManager.list();

这并不美观或优雅,可能会违反所有编码规范,但在我的情况下,它将一个操作从需要30秒变成了300毫秒,所以在我的情况下它是值得的。

如果你的资产文件夹经常更改,手动更新列表可能会很麻烦,你可以考虑在构建过程中放置一个脚本,自动为你创建此目录列表文件。


免责声明:自我推广。我创建了一个 Gradle 插件,专门用于添加编译时安全性,其附加好处是自动生成每个文件夹的列表。请访问 github.com/oriley-me/crate 了解更多信息。 - Kane O'Riley

0

你有没有考虑过为这个过程使用单独的线程?通过使用AysncTask,你可以潜在地加速后台处理并且不使用UI线程。它的主要用途是在单独的线程中执行后台操作并将结果发布到UI,但你仍然可以利用它来实现你的目的。


我已经在继承AysncTask类的类中使用了这种方法。 - Sviatoslav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接