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

How to store Url into ArrayList from Firebase Storage?

我正在尝试将所有 Url 的列表从 Firebase 存储获取到 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));
                }
            });


        }
}}

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

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

我将在下面 link 一些类似的问题,但要记住的重要一点是,任何需要下载 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
    }
})

另请参阅:

  • Can someone help me with logic of the firebase on success listener