如何从侦听器方法返回变量

时间:2016-09-18 05:47:11

标签: java android

在下面的代码中,我声明了类变量downloadUrl,它稍后在方法ImageLoad中设置。我试图设置变量并在调用方法时返回它。但是我看到变量返回null。这里发生了什么?如何正确返回此变量?

public class ImageActions {

private Uri downloadUrl;

public Uri ImageLoad()
{
    FirebaseStorage storage = FirebaseStorage.getInstance();
    StorageReference storageRef = storage.getReferenceFromUrl("gs://apptest.appspot.com");

    Uri file = Uri.fromFile(new File("sdcard/DCIM/Camera/1466831822883.jpg"));

    StorageMetadata metadata = new StorageMetadata.Builder().setContentType("image/jpeg").build();

    UploadTask uploadTask = storageRef.child("images/"+file.getLastPathSegment()).putFile(file, metadata);

    uploadTask.addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
        @Override
        public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
            double progress = (100.0 * taskSnapshot.getBytesTransferred()) / taskSnapshot.getTotalByteCount();
            System.out.println("Upload is " + progress + "% done");
        }
    }).addOnPausedListener(new OnPausedListener<UploadTask.TaskSnapshot>() {
        @Override
        public void onPaused(UploadTask.TaskSnapshot taskSnapshot) {
            System.out.println("Upload is paused");
        }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception exception) {
            // Handle unsuccessful uploads
            System.out.println("Upload failed");
        }
    }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
        @Override
        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
            // Handle successful uploads on complete
            downloadUrl = taskSnapshot.getMetadata().getDownloadUrl();
            System.out.println("beforeReturn" + downloadUrl); //This prints correct (non-null) value
            System.out.println("Upload completed");                
        }
    });

    System.out.println("beforeReturn" + downloadUrl); //This prints null

    return downloadUrl;

 }
}

1 个答案:

答案 0 :(得分:1)

您可以按照以下方式执行此操作:

public class ImageActions {

public interface OntaskCompleted{
   void onSuccess(Uri returnurl);
   void onfail();
}

private Uri downloadUrl;

public void ImageLoad(final OntaskCompleted listener)
{
    FirebaseStorage storage = FirebaseStorage.getInstance();
    StorageReference storageRef = storage.getReferenceFromUrl("gs://apptest.appspot.com");

    Uri file = Uri.fromFile(new File("sdcard/DCIM/Camera/1466831822883.jpg"));

    StorageMetadata metadata = new StorageMetadata.Builder().setContentType("image/jpeg").build();

    UploadTask uploadTask = storageRef.child("images/"+file.getLastPathSegment()).putFile(file, metadata);

    uploadTask.addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
        @Override
        public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {

        }
    }).addOnPausedListener(new OnPausedListener<UploadTask.TaskSnapshot>() {
        @Override
        public void onPaused(UploadTask.TaskSnapshot taskSnapshot) {
            System.out.println("Upload is paused");
        }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception exception) {
            // Handle unsuccessful uploads
            listener.onfail();
        }
    }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
        @Override
        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
            // Handle successful uploads on complete
            downloadUrl = taskSnapshot.getMetadata().getDownloadUrl();
                  System.out.println("Upload completed");  
            listenr.onSuccess(downloadurl)              
        }
    });

 }
}

现在调用此函数如下:

ImageLoadObject.ImageLoad(new OntaskCompleted(){

   @Override
   void onSuccess(Uri url){
      //Here you will get the url after upload complete
   }
   @Override
   void onFail(){

   }
});

希望这会对你有所帮助。