【发布时间】:2018-05-02 04:22:05
【问题描述】:
我正在开发一个画廊应用程序,它可以显示手机或笔式驱动器中的所有图像。我成功地列出了所有图像并将其显示到应用程序中。但我认为它很慢。我在AsyncTask 中使用Depth First Search 技术。那么有没有其他方法可以在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);
}
这是输出。
【问题讨论】:
-
I'm using DFS什么是 DFS? -
for(DocumentFile f:root.listFiles()){什么是“根”? -
DFS :Depth First Search root : 是根目录路径。
-
那么你不应该告诉你如何获得'root'以及它包含什么吗?您可能同时知道,您的帖子很不清楚。
-
上传了完整的代码和更多关于root的信息。
标签: android file-io android-asynctask gallery image-gallery