在 firebase 存储上使用 for 循环上传图像后,如何获取图像的 url?
How can i get the url of the images after i've uploaded them with a for loop on firebase storage?
我在 URI 文件上有一个数组,我使用 for 循环将它们上传到 firebase 存储。按照文档,我可以下载 url 在 UploadTask
对象上实现 continueWithTask
和 addOnCompleteListener
方法,所以我尝试将所有 url 保存在一个数组中.我的问题是我用来保存 url 的数组是空的,但是在计算代码后图像上传到 firestore Storage 文件夹可能是因为 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);
}
}
});
}
url
请求后我的数组downloadUrl为空
您可以一个一个地上传文件,然后将 Uri
添加到列表中。由于上传是一个异步任务,你必须将整个块包装到一个新的线程中并等待每个完成让它们一个一个执行。
我搜索了一下,已有帖子询问如何等待多次回调。我在其中一个中发布了答案。 Here 是答案的 link。
检查后进一步阅读。
这里是实施那里描述的内容后的样子。 (我没有运行代码,可能有小错误。)
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();
我在 URI 文件上有一个数组,我使用 for 循环将它们上传到 firebase 存储。按照文档,我可以下载 url 在 UploadTask
对象上实现 continueWithTask
和 addOnCompleteListener
方法,所以我尝试将所有 url 保存在一个数组中.我的问题是我用来保存 url 的数组是空的,但是在计算代码后图像上传到 firestore Storage 文件夹可能是因为 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);
}
}
});
}
url
请求后我的数组downloadUrl为空您可以一个一个地上传文件,然后将 Uri
添加到列表中。由于上传是一个异步任务,你必须将整个块包装到一个新的线程中并等待每个完成让它们一个一个执行。
我搜索了一下,已有帖子询问如何等待多次回调。我在其中一个中发布了答案。 Here 是答案的 link。 检查后进一步阅读。
这里是实施那里描述的内容后的样子。 (我没有运行代码,可能有小错误。)
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();