我想创建类似“PDF Viewer应用程序”的东西。应用程序将在用户选择的位置搜索所有* .pdf文件。用户可以通过以下功能选择该文件夹:
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, REQUEST_CODE);
然后我得到DocumentFile(文件夹):
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == getActivity().RESULT_OK && requestCode == REQUEST_CODE) {
Uri uriTree = data.getData();
DocumentFile documentFile = DocumentFile.fromTreeUri(getActivity(), uriTree);
//rest of code here
}
}
为什么我选择这种选择文件夹的方法?因为我想选择次要存储(在Android> = 5.0中,您无法使用Java.io.file访问次要存储)。
好的,所以我将所有* .pdf文件都保存为DocumentFile文件夹。然后我打电话给:
for(DocumentFile file: documentFile.listFiles()){
String fileNameToDisplay = file.getName();
}
这是非常慢。当所选文件夹中有〜600个文件时,大约需要30秒。为了证明这一点,我从外部存储(不是辅助存储)中选择了目录,然后尝试了两种解决方案:DocumentFile和File。
文件版本如下所示:
File f = new File(Environment.getExternalStorageDirectory()+"/pdffiles");
for(File file: f.listFiles()){
String fileNameToDisplay = file.getName();
}
}
第二个版本的速度提高了约500倍。在列表视图上几乎没有时间显示所有文件。
为什么 DocumentFile 这么慢?
最佳答案
为什么DocumentFile这么慢?
对于约600个文件,您正在执行约600个ContentProvider
请求以获取显示名称,这意味着约600个IPC事务。
相反,请使用MediaStore
来查询所有application/pdf
MIME类型的索引媒体。