我想创建类似“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类型的索引媒体。

10-06 06:50