在addOnSuccessListener(android应用程序)之外的java firebase上获取文件上载的成功或失败

在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

我正在用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();

}
公共类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
            }
        });
    }