проблема порядка выполнения addOnSuccesListener, хранилище firebase - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть элемент StorageReference, который хранит ссылку на папку из firebase, и я пропускаю oop через ее элементы, чтобы получить каждую ссылку для скачивания, но я не понимаю, почему она выполняется в таком порядке. Раньше я делал нечто подобное, и это работало, но теперь по какой-то причине я не понимаю, почему, это не работает так, как должно, и почему он так прыгает на слушателей.

private interface FirestoreCallback {
    void onCallback(List<Uri> uris);
}
public ArrayList<Uri> getAllDownloadURIs(final FirestoreCallback firestoreCallback) {
    StorageReference folderPath = ListVideoDates.storage.getReference((String) extra.getSerializable("folderPath"));
    System.out.println("FOLDER PATH: " + folderPath);

    final ArrayList<Uri> uris = new ArrayList<>();

    folderPath.listAll()
            .addOnSuccessListener(new OnSuccessListener<ListResult>() {
                @Override
                public void onSuccess(ListResult listResult) {
                    for (StorageReference file : listResult.getItems()) {
                        file.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                            @Override
                            public void onSuccess(Uri uri) {
                                uris.add(uri);
                                System.out.println("Array inside onSucces2" + uris); // second
                                // here the array is printed as elements are 
                                //inserted, but this listener is the last 
                                //executed listener for some god damn reason

                            }
                        });
                    }
                   // firestoreCallback.onCallback(uris);
                }
            }).addOnSuccessListener(new OnSuccessListener<ListResult>() {
        @Override
        public void onSuccess(ListResult listResult) {
           // firestoreCallback.onCallback(uris);
            System.out.println("Array inside onSucces3" + uris); // first
        }
    });

Почему первый исполненный слушатель является вторым и почему тогда он переходит к «первому»? Я также попытался вставить обратные вызовы в обоих местах (прокомментировано выше), и он все еще не работает независимо от выполнения порядка слушателя, он все еще пуст, когда я пытаюсь получить доступ к нему с помощью метода ниже.

public void setAllDownloadURIs() {
    getAllDownloadURIs(new FirestoreCallback() {
        @Override
        public void onCallback(List<Uri> uri) {
            uris = new ArrayList<>(uri);
            System.out.println("URIS inside onCallback: " + uris);
        }
    });
}
   FOLDER PATH: gs://***************************
W/StorageUtil: no auth token for request
I/System.out: URI inside setAllDownloadURIs: null
W/NetworkRequest: no auth token for request
I/System.out: Array inside onSucces3[]
W/StorageUtil: no auth token for request
W/NetworkRequest: no auth token for request
W/StorageUtil: no auth token for request
W/NetworkRequest: no auth token for request
W/StorageUtil: no auth token for request
W/StorageUtil: no auth token for request
W/NetworkRequest: no auth token for request
W/NetworkRequest: no auth token for request
I/System.out: Array inside onSucces2
I/System.out: Array inside onSucces2
I/System.out: Array inside onSucces2
I/System.out: Array inside onSucces2

И здесь я получаю 4 вывода массива, поскольку в папке 4 элемента, и они печатаются, когда программа вставляет их в массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...