我正在使用一个图库应用程序,它可以显示手机或笔式驱动器中的所有图像。我成功地设法列出了所有图像并将其显示在应用程序中。但我认为这很慢。我在Depth First Search
内使用AsyncTask
技术。那么还有其他方法可以在AsyncTask
内使用,这种方法要快得多。
这里的root是一个DocumentFile,它由树URI构成。
以下是我使用的代码。
public class ImageBackgroundTask extends AsyncTask<Object, Object, ArrayList<DocumentFile>> {
DocumentFile root;
ArrayList<DocumentFile> result;
ProgressDialog pg;
Context context;
private AsyncTaskCompleteListener<ArrayList<DocumentFile> > callback;
ImageBackgroundTask(DocumentFile root, Context context, AsyncTaskCompleteListener<ArrayList<DocumentFile>> cb){
this.context=context;
this.root=root;
this.callback = cb;
}
@Override
protected ArrayList<DocumentFile> doInBackground(Object... voids) {
Queue<DocumentFile> stack=new ArrayDeque<>();
ArrayList<DocumentFile> list=new ArrayList<>();
for(DocumentFile f:root.listFiles()){
stack.add(f);
}
while(!stack.isEmpty()){
DocumentFile child=stack.remove();
if(child.isDirectory()){
for(DocumentFile file:child.listFiles()){
stack.add(file);
}
}
else if(child.isFile()){
String name=child.getName();
if(name.endsWith(".jpg")
|| name.endsWith(".png")
|| name.endsWith("jpeg")
|| name.endsWith("JPG")
|| name.endsWith("JPEG")
|| name.endsWith("PNG"))
list.add(child);
}
}
return list;
}
@Override
protected void onPreExecute() {
pg=new ProgressDialog(context);
pg.setMessage("Loading...");
pg.show();
}
@Override
protected void onProgressUpdate(Object... values) {
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(ArrayList<DocumentFile> aVoid) {
pg.dismiss();
result=aVoid;
callback.onTaskComplete(result);
}
以下是输出。
答案 0 :(得分:0)
这就是我通常做这些事情的方式:
public ArrayList<String> getFile(File directory) {
File listFile[] = directory.listFiles();
if (listFile != null && listFile.length > 0) {
for (File file : listFile) {
if (file.isDirectory()) {
getFile(file);
}
else {
if (file.getName().endsWith(".png")
|| file.getName().endsWith(".jpg"))
{
String temp = file.getPath().substring(0, file.getPath().lastIndexOf('/'));
if (!fileList.contains(temp))
fileList.add(temp);
}
}
}
}
return fileList;
}
答案 1 :(得分:0)
请勿使用DocumentFile.listFiles()
列出使用Intent.ACTION_OPEN_DOCUMENT_TREE
获得的树的文件。
因为它非常慢。
而是使用DocumentsContract
中的函数。
void traverseDirectoryEntries(Uri rootUri)
函数
为每个文件收集子uri,而不是尝试为它获取DocumentFile。
之后您可以使用该子uri加载图像。
如果你现在需要6秒钟,那么我认为只需不到一秒钟就可以使用DocumentsContract。