我在URI文件上有一个数组,并使用for循环将它们上传到Firebase存储上。根据文档,我可以获得在continueWithTask
对象上实现addOnCompleteListener
和UploadTask
方法的下载URL,因此我尝试将所有URL保存在数组中。我的问题是,我用来保存url的数组为空,但是在计算代码之后,图像就上传到了Firestore存储文件夹中,这可能是因为continueWithTask
和addOnCompleteListener
是异步方法。
我该如何解决?
for (int i = 0; i < photos.size(); i++) {
mStorage=FirebaseStorage.getInstance().getReference().child("images/" + j);
mUploadTask=mStorage.putFile(photos.get(i));
Task<Uri>urlTask = uploadTask.continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() {
@Override
public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception {
if(!task.isSuccessful()){
throw task.getException();
}
return mStorage.getDownloadUrl();
}
}).addOnCompleteListener(new OnCompleteListener<Uri>() {
@Override
public void onComplete(@NonNull Task<Uri> task) {
if(task.isSuccessful()){
String url = task.getResult().toString();
downloadUrl.add(url);
}
}
});
}
请求网址后,我的数组downloadUrl为空
答案 0 :(得分:1)
您可以一个一个地上传文件,并将Uri
添加到列表中。由于上载是异步任务,因此您必须将整个块包装到一个新线程中,并等待每个线程完成以使它们一个接一个地执行。
当我搜索时,已有帖子询问如何等待多个回调。我在其中一个中发布了答案。 Here是答案的链接。 检查后进一步阅读。
在执行此处描述的内容后,它的外观如何。 (我没有运行代码。可能有一些小错误。)
new Thread(new Runnable() {
@Override
public void run() {
final List < String > urls = new ArrayList();
for (int i = 0; i < photos.size(); i++) {
mStorage = FirebaseStorage.getInstance().getReference().child("images/" + j);
mUploadTask = mStorage.putFile(photos.get(i));
final ThreadLockedTask < String > t = new ThreadLockedTask < > ();
final String url = t.execute(new Runnable() {
@Override
public void run() {
Task < Uri > urlTask = uploadTask.continueWithTask(new Continuation < UploadTask.TaskSnapshot, Task < Uri >> () {
@Override
public Task < Uri > then(@NonNull Task < UploadTask.TaskSnapshot > task) throws Exception {
if (!task.isSuccessful()) {
t.setResult(null);
throw task.getException();
}
return mStorage.getDownloadUrl();
}
}).addOnCompleteListener(new OnCompleteListener < Uri > () {
@Override
public void onComplete(@NonNull Task < Uri > task) {
if (task.isSuccessful()) {
String url = task.getResult().toString();
t.setResult(url);
}
}
});
}
});
if(url!=null)
urls.add(url);
}
//Now you have all the urls in the list "urls"
}
}).start();