列出Android上Firebase存储文件夹中的所有文件

时间:2020-02-12 17:47:20

标签: android firebase firebase-storage

我正在尝试获取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_;
}

1 个答案:

答案 0 :(得分:0)

root.child('images').listAll()

将此listAll()与存储参考一起使用以获取该文件夹中所有文件的列表。