如何将 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
我正在尝试将所有 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