2 回答
TA贡献1934条经验 获得超2个赞
我知道为同一件事设置两个 OnSuccessListener 效率低下
您有两个要尝试完成的任务:
上传一个文件
获取该文件的下载 URL
由于这是两个独立的任务,因此您需要两个OnSuccessListeners. 这并没有什么低效的地方,任务也不尽相同。
上传后获取下载 URL的 Firebase 文档准确地展示了如何连续完成这两个任务:
final StorageReference ref = storageRef.child("images/mountains.jpg");
uploadTask = ref.putFile(file);
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();
}
// Continue with the task to get the download URL
return ref.getDownloadUrl();
}
}).addOnCompleteListener(new OnCompleteListener<Uri>() {
@Override
public void onComplete(@NonNull Task<Uri> task) {
if (task.isSuccessful()) {
Uri downloadUri = task.getResult();
} else {
// Handle failures
// ...
}
}
});
您会注意到,此代码首先完成uploadTask(上传文件),然后才开始一个新任务以获取下载 URL。按此顺序执行任务可防止您收到“对象在该位置不存在”错误消息。
TA贡献1775条经验 获得超8个赞
尝试使用这个:
private Uri ImageUri; //and get image from gallery intent to this ImageUri
...............
StorageReference filePath = FirebaseStorage.getInstance().getReference().child("Club Images").child(ImageUri.getLastPathSegment() + ".jpg");
filePath.putFile(ImageUri).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
@Override
public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task)
{
if(task.isSuccessful())
{
downloadUrl = task.getResult().getDownloadUrl().toString();
updatetoFirebaseDatabase();
}
else
{
String message = task.getException().getMessage();
}
}
});
...........
创建 updatetoFirebaseDatabase(String imageUrl) 方法:
updatetoFirebaseDatabase(String imageUrl){
//implement FirebaseDatabase setvalue method with given image URL
}
添加回答
举报
