java - 在addOnSuccessListener(android应用程序)之外的java中获取文件上传成功或失败
问题描述
我正在用java制作一个android应用程序,我需要在firebase存储上上传一个文件。问题是 onFailure 和 onSuccess 方法是无效的,不能返回任何东西!如果上传成功与否,我需要知道上传何时完成...
我也尝试修改类或方法中的变量,但它不起作用,因为侦听器是异步的......这是我的 java 类:
public class MyFirebase {
// Upload picture to firebase
public Boolean uploadToFirebase (Uri path, String nameFile, FirebaseStorage storage) throws InterruptedException {
// Create a storage reference from the app
StorageReference storageRef = storage.getReference();
UploadTask uploadTask;
// START upload
Uri file = Uri.fromFile(new File(String.valueOf(path)));
final StorageReference ref = storageRef.child("scanned_images/"+nameFile);
uploadTask = ref.putFile(file);
// Register observers to listen for when the download is done or if it fails
uploadTask.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
Log.d("upload", "uploadToFirebase: fail ");
}
}).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
Log.d("upload", "uploadToFirebase: success ");
}
});
return uploadTask.isSuccessful();
}
}
解决方案
您需要为此创建侦听器,因为这些调用是异步发生的,您不能那样返回它。
您可以在下面创建一个interface
类似的。
public interface MyResponseListener {
void onSuccess();
void onFailure();
}
并将其作为参数传递给您的方法。
// 上传图片到firebase
public void uploadToFirebase (Uri path, String nameFile, FirebaseStorage storage,
final MyResponseListener myResponseListener) throws InterruptedException {
// Create a storage reference from the app
StorageReference storageRef = storage.getReference();
UploadTask uploadTask;
// START upload
Uri file = Uri.fromFile(new File(String.valueOf(path)));
final StorageReference ref = storageRef.child("scanned_images/"+nameFile);
uploadTask = ref.putFile(file);
// Register observers to listen for when the download is done or if it fails
uploadTask.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
Log.d("upload", "uploadToFirebase: fail ");
myResponseListener.onFailure();
}
}).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
Log.d("upload", "uploadToFirebase: success ");
myResponseListener.onSuccess();
}
});
}
最后在你喜欢的地方使用它:
private void setListener() {
myFirebase.uploadToFirebase(path, nameFile, storage,new MyResponseListener() {
@Override
public void onSuccess() {
//handle success
}
@Override
public void onFailure() {
//hanlde failure
}
});
}
推荐阅读
- azure - 如何在 Azure Key Vault 中添加键值?
- html - onClick - 将样式更改为多个 DOM 节点
- php - 当似乎没有语法错误时抛出 PHP 语法错误
- google-analytics - Google Analytics BigQuery 导出:获得不同的收入数字
- android - 目标 sdk 26 上的 Android Studio 应用程序在切换到目标 sdk 29 28 或其他情况时失去互联网
- javascript - 在 Bootstrap 4 中从单个模式加载多个 youtube 视频
- python - 我无法将线性方程符号化地求解为变量,即使手动完成它非常简单
- c# - C# OnClick .NET 框架坐标限制
- c# - 字符串未被识别为有效的日期时间。将字符串转换为日期时间
- java - 使用 Maven 执行器跳过模块