在Android中更快地排序DocumentFiles数组

3
在这种情况下,我需要使用这种方法对数百个DocumentFile对象进行排序:
                DocumentFile[] files = documentFile.listFiles();
                ArrayList<DocumentFile> docFiles = new ArrayList<DocumentFile>();

                Arrays.sort(files, new Comparator() {
                    public int compare(Object o1, Object o2) {

                        if (((DocumentFile)o1).lastModified() < ((DocumentFile)o2).lastModified()) {
                            return -1;
                        } else if (((DocumentFile)o1).lastModified() > ((DocumentFile)o2).lastModified()) {
                            return +1;
                        } else {
                            return 0;
                        }
                    }

                });

                if (files != null) {
                    for (DocumentFile file : files) {

                        if (!docFiles.contains(file))
                            docFiles.add(file);



                    }

然而,这个过程太慢了,使用200个DocumentFile对象需要近一分钟。我无法理解这种重要的类为什么会这么慢。它将不得不在最近的范围存储更改中更加频繁地使用。

有人知道如何更快地完成此排序过程吗?


每个lastModified()调用都涉及与ContentProvider的IPC。DocumentFile不缓存此类数据(部分原因是其可能会更改)。创建一个名为DocumentFileEntry的类(或任何其他名称),该类保存DocumentFile及其最后修改时间戳。构建一个“DocumentFileEntry”列表,并使用lastModified()的值填充最后修改的时间戳。然后,对DocumentFileEntry列表进行排序,以便您可以从这些已缓存的时间戳中工作。 - CommonsWare
如果您需要速度,那就不要一开始使用DocumentFile来列出目录内容。请改用DocumentsContract,它可能会快上20倍。 - blackapps
1
你们有示例可以提供吗,这样我就可以接受答案了。 - Matt Riley
1个回答

0

许多 - 也许是大多数 - DocumentFile 上的方法最终会向 ContentProvider 发出请求。这些请求并不便宜。而 lastModified() 就是这样一种方法。对 200 个对象进行排序将导致成千上万次这样的调用,这就是为什么需要很长时间。

你可以做的是:

  • 创建一个包装器,用于保存 DocumentFile 和缓存的 lastModified() 副本
  • 从你的 DocumentFile 对象列表中创建这些包装器的列表,这样你每个 DocumentFile 只需进行一次 lastModified() 调用
  • 使用 Comparator 中缓存的 lastModified() 值对包装器列表进行排序

进行 200 次 lastModified() 调用不会很快,但比进行成千上万次这样的调用要快得多。


由于DocumentFile构造函数是包私有的,因此无法扩展。 - t0m
@t0m:我建议创建一个包装器,而不是创建一个子类。 - CommonsWare

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