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
}
添加回答
舉報