如何将 Url 从 Firebase Storage 存储到 ArrayList 中?

Posted

技术标签:

【中文标题】如何将 Url 从 Firebase Storage 存储到 ArrayList 中?【英文标题】:How to store Url into ArrayList from Firebase Storage? 【发布时间】:2021-09-11 17:22:04 【问题描述】:

我正在尝试从 Firebase 存储中获取所有 Url 的列表到 ArrayList 中。我尝试使用 getDownloadUrl() 方法,但 ArrayList 仍然为空。

这是我的代码-


public class LoggedIn extends AppCompatActivity 
RecyclerView recyclerView;
    
    ArrayList<Uri> Url=new ArrayList<>();
StorageReference storageReference= FirebaseStorage.getInstance().getReference();
    int in;
    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_logged_in);
        Bundle extras=getIntent().getExtras();
        String value = extras.getString("email");

        for(in=1;in<6;in++)
            storageReference.child(in+".png").getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() 
                @Override
                public void onSuccess(Uri uri) 

                    Url.add(in,uri);
                    Log.d("success",String.valueOf(uri));

                
            ).addOnFailureListener(new OnFailureListener() 
                @Override
                public void onFailure(@NonNull Exception e) 
                    Log.d("Failed",String.valueOf(e));
                
            );


        

【问题讨论】:

【参考方案1】:

我的猜测是您在 Url.add(in,uri) 执行之前使用了 Url 列表。

因为getDownloadUrl() 需要调用服务器,所以它是异步处理的。这意味着您的主代码继续运行,而应用程序在后台等待下载 URL。然后,一旦下载 URL 可用,就会使用该值调用您的 onSuccess

我将在下面链接一些类似的问题,但要记住的重要一点是,任何需要下载 URL 的代码都需要在 onSuccess 内或从那里调用。

如果您想等待所有下载 URL 可用,可以使用Tasks.whenAllSuccess

Task[] tasks = new Task[6];
for(in=1;in<6;in++)
    Task task = storageReference.child(in+".png").getDownloadUrl();
    tasks[i] = task;
    task.addOnSuccessListener(new OnSuccessListener<Uri>() 
        @Override
        public void onSuccess(Uri uri) 
            Url.add(in,uri);
            Log.d("success",String.valueOf(uri));
        
    ).addOnFailureListener(new OnFailureListener() 
        @Override
        public void onFailure(@NonNull Exception e) 
            Log.d("Failed",String.valueOf(e));
        
    );

Tasks.whenAllSuccess(tasks).addOnSuccessListener(new OnSuccessListener<List<Uri>>() 
    @Override
    public void onSuccess(List<Uri> results) 
        ... you can use `resuls` or `Url` here
    
)

另见:

How to get download url for firebase storage and update firestore document? Can someone help me with logic of the firebase on success listener getContactsFromFirebase() method return an empty list Setting Singleton property value in Firebase Listener Firebase - android - fetchProvidersForEmail - Why are all the calls asynchronous? How to deal with the values taken from asynchronous methods like onComplete?

【讨论】:

谢谢!这有效。

以上是关于如何将 Url 从 Firebase Storage 存储到 ArrayList 中?的主要内容,如果未能解决你的问题,请参考以下文章

将图片从 URL 上传到 Firebase 存储

如何从Firebase将单个图像URL串入我的flutter应用程序?

如何从firebase数据库中检索url并通过UIButton(SWIFT)显示url?

如何从 Firebase 存储中获取调整大小的图片下载 URL

如何添加onclick imageview网址以及如何从firebase更新网址

如何从 URL 中删除 Firebase 存储文件