2016-09-18 12 views
-2

以下のコードでは、クラス変数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; 

} 
} 
+0

アップロードタスクが非同期で、nullを取得するステートメントが 'onSuccess'の前に実行されるので、nullになります。これは、' uploadtask'を開始した直後にS.O.Pステートメントが実行されるようなものです。独自のインターフェイスを作成することでURLを返すことができます。これが最善の方法です。 –

答えて

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(){ 

    } 
}); 

が、これはあなたのお役に立てば幸いです。

+0

ありがとうございます。これは役に立ちます。 – dacscan3669

関連する問題