Вывести список всех файлов в папке Firebase Storage на Android - PullRequest
0 голосов
/ 12 февраля 2020

Я пытаюсь получить список всех файлов, присутствующих в папке Firebase Storage (с файлами подпапок ... et c ...), но у меня возникают некоторые проблемы. Поскольку 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_;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...