在 Android 中更快地对文档文件数组进行排序
Sort array of DocumentFiles faster in Android
在这种情况下,我必须使用此方法对数百个 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 对象。我无法理解这种 vital class 这么慢。随着最近的范围存储更改,它将不得不更多地使用它。
有人知道如何更快地完成此排序过程吗?
DocumentFile
上的许多(也许是大多数)方法最终都会发出 ContentProvider
的请求。这样的要求并不便宜。而lastModified()
就是这样一种方法。对 200 个对象进行排序将导致数千次此类调用,这就是需要很长时间的原因。
您可以做的是:
- 为
DocumentFile
创建一个包装器,其中包含 DocumentFile
以及 lastModified()
的缓存副本
- 从您的
DocumentFile
个对象列表中创建一个列表,这样您每个 DocumentFile
调用一次 lastModified()
- 使用
Comparator
中缓存的 lastModified()
值对包装器列表进行排序
进行 200 个 lastModified()
调用不会很快,但比进行数千次这样的调用要快。
在这种情况下,我必须使用此方法对数百个 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 对象。我无法理解这种 vital class 这么慢。随着最近的范围存储更改,它将不得不更多地使用它。
有人知道如何更快地完成此排序过程吗?
DocumentFile
上的许多(也许是大多数)方法最终都会发出 ContentProvider
的请求。这样的要求并不便宜。而lastModified()
就是这样一种方法。对 200 个对象进行排序将导致数千次此类调用,这就是需要很长时间的原因。
您可以做的是:
- 为
DocumentFile
创建一个包装器,其中包含DocumentFile
以及lastModified()
的缓存副本
- 从您的
DocumentFile
个对象列表中创建一个列表,这样您每个DocumentFile
调用一次 - 使用
Comparator
中缓存的
lastModified()
lastModified()
值对包装器列表进行排序
进行 200 个 lastModified()
调用不会很快,但比进行数千次这样的调用要快。