在addOnSuccessListener(android应用程序)之外的java firebase上获取文件上载的成功或失败
我正在用java制作一个android应用程序,我需要在firebase存储上上传一个文件。问题是onFailure和onSuccess方法是无效的,不能返回任何东西!我需要知道何时上传完成,如果它是一个成功或不 我也试图修改类或方法中的变量,但它不起作用,因为侦听器是异步的。。。 这是我的java类:在addOnSuccessListener(android应用程序)之外的java firebase上获取文件上载的成功或失败,java,android,firebase,Java,Android,Firebase,我正在用java制作一个android应用程序,我需要在firebase存储上上传一个文件。问题是onFailure和onSuccess方法是无效的,不能返回任何东西!我需要知道何时上传完成,如果它是一个成功或不 我也试图修改类或方法中的变量,但它不起作用,因为侦听器是异步的。。。 这是我的java类: public class MyFirebase { // Upload picture to firebase public Boolean uploadToFirebase (Uri pa
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();
}
公共类MyFirebase{
//将图片上载到firebase
public Boolean uploadToFirebase(Uri路径、字符串名称文件、FirebaseStorage)引发InterruptedException{
//从应用程序创建存储引用
StorageReference-storageRef=storage.getReference();
上传任务上传任务;
//开始上传
Uri file=Uri.fromFile(新文件(String.valueOf(path));
最终StorageReference ref=storageRef.child(“扫描的图像/”+名称文件);
uploadTask=ref.putFile(文件);
//注册观察员,以便在下载完成时或下载失败时监听
uploadTask.addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常){
Log.d(“上传”,“上传到Firebase:失败”);
}
}).addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公共无效(UploadTask.TaskSnapshot TaskSnapshot){
Log.d(“上传”,“上传到Firebase:success”);
}
});
返回uploadTask.isSuccessful();
}
}我认为这是不可能的,但是您可以在
onSuccess
和onFailure
函数中返回函数的结果
uploadTask.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
Log.d("upload", "uploadToFirebase: fail ");
return false
}
}).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
Log.d("upload", "uploadToFirebase: success ");
return true
}
});
uploadTask.addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常){
Log.d(“上传”,“上传到Firebase:失败”);
返回错误
}
}).addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公共无效(UploadTask.TaskSnapshot TaskSnapshot){
Log.d(“上传”,“上传到Firebase:success”);
返回真值
}
});
您需要为此创建侦听器,因为这些调用是异步进行的,您不能像那样返回它
您可以创建一个界面
,如下所示
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();
}
});
}
Firebase API是异步的,您不能简单地返回这样的同步结果。你应该一直等待结果。非常感谢,太完美了!!我已经用这种方法找到了解决办法,但我忘了做其他事情。。。
private void setListener() {
myFirebase.uploadToFirebase(path, nameFile, storage,new MyResponseListener() {
@Override
public void onSuccess() {
//handle success
}
@Override
public void onFailure() {
//hanlde failure
}
});
}