首页 > 解决方案 > addOnSuccesListener 执行顺序问题,firebase 存储

问题描述

我有一个 StorageReference 元素,它存储来自 firebase 的文件夹引用,我遍历它的元素以获取每个下载链接,但我不明白为什么它按此顺序执行。我以前做过类似的事情并且它起作用了,但现在由于某种原因,我不明白为什么,它没有按应有的方式工作,以及为什么它会以这种方式跳动听众。

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
        }
    });

为什么执行的第一个侦听器是第二个侦听器,为什么然后它跳到 f“第一个”侦听器?我也尝试在两个位置插入回调(上面评论),无论监听器订单执行如何,它仍然不起作用,当我尝试使用下面的方法访问它时它仍然是空的。

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 个元素,并且在程序将它们插入数组时打印它们。

标签: androidfirebasefirebase-storage

解决方案


推荐阅读