我正在尝试获取Firebase Storage文件夹中存在的所有文件的列表(以及子文件夹...等的文件),但是我遇到了一些问题。由于Firebase Storage不支持此功能,因此我必须自己编写代码,我在下面编写了代码,它可以正常工作,但是不幸的是,当调用它的结果不合适时,我需要列表的第一遍,我需要最后的遍当所有结果都在列表中时。 我该如何进行?
storageReference.listAll().addOnCompleteListener(new OnCompleteListener<ListResult>() {
@Override
public void onComplete(@NonNull Task<ListResult> task) {
System.out.println(buildFireBaseFiles(task.getResult(), null));
//downloadFiles(buildFireBaseFiles(task.getResult()), data_view);
}
});
-
List<Uri> uris_ = new ArrayList<>();
private List<Uri> buildFireBaseFiles(final ListResult listResult, final @Nullable List<Uri> uris) {
if (uris == null)
uris_ = new ArrayList<>();
else
uris_ = uris;
if (listResult != null) {
if (listResult.getPrefixes().size() != 0 && listResult.getPrefixes().size() != -1) {
for (StorageReference s : listResult.getItems()) {
uris_.add(Uri.parse(s.getPath()));
}
for (StorageReference s : listResult.getPrefixes()) {
s.listAll().addOnCompleteListener(new OnCompleteListener<ListResult>() {
@Override
public void onComplete(@NonNull Task<ListResult> task) {
buildFireBaseFiles(task.getResult(), uris_);
System.out.println("1 " + uris_.size());
}
});
}
} else if (listResult.getItems().size() != 0 && listResult.getItems().size() != -1) {
for (StorageReference s : listResult.getItems()) {
uris_.add(Uri.parse(s.getPath()));
}
}
}
if (uris != null)
System.out.println("2 " + uris.size());
return uris_;
}
输出:
I/System.out: 2 3
I/System.out: 1 3
I/System.out: 2 5
I/System.out: 1 5
...
after a while
...
I/System.out: 2 83
I/System.out: 1 83
但是返回列表的大小(buildFireBaseFiles(task.getResult(),null).size())为3而不是83
编辑:我认为问题是
s.listAll().addOnCompleteListener(new OnCompleteListener<ListResult>() {
@Override
public void onComplete(@NonNull Task<ListResult> task) {
buildFireBaseFiles(task.getResult(), uris_);
System.out.println("1 " + uris_.size());
}
});
因为buildFireBaseFiles是一个递归调用,而递归调用在onComplete中不起作用
重新编辑:解决方案(!!这不是最好的方法,但是它可以工作!!)
private List<Uri> uris_ = new ArrayList<>();
private List<Uri> buildFireBaseFiles(final ListResult listResult, final @Nullable List<Uri> uris) {
if(uris ==null)
uris_ =new ArrayList<>();
if(listResult !=null){
if (listResult.getPrefixes().size() != 0 && listResult.getPrefixes().size() != -1) {
for (StorageReference s : listResult.getItems()) {
uris_.add(Uri.parse(s.getPath()));
}
for (StorageReference s : listResult.getPrefixes()) {
final Task<ListResult> b = s.listAll();
//Bad, can block the UI, better to run in a Thread !
while (!b.isComplete());
buildFireBaseFiles(b.getResult(), uris_);
/*
Good Usage but don't allow Recursive Call...
b.addOnCompleteListener(new OnCompleteListener<ListResult>() {
@Override
public void onComplete(@NonNull Task<ListResult> task) {
uris_ = buildFireBaseFiles(task.getResult(), uris_);
System.out.println("1 " + uris_.size());
}
});
*/
}
} else if (listResult.getItems().size() != 0 && listResult.getItems().size() != -1) {
for (StorageReference s : listResult.getItems()) {
uris_.add(Uri.parse(s.getPath()));
}
}
}
return uris_;
}
答案 0 :(得分:0)
root.child('images').listAll()
将此listAll()
与存储参考一起使用以获取该文件夹中所有文件的列表。