首页 > 解决方案 > 在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();

}

}

标签: javaandroidfirebase

解决方案


您需要为此创建侦听器,因为这些调用是异步发生的,您不能那样返回它。

您可以在下面创建一个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
            }
        });
    } 

推荐阅读