在下面的代码中,我声明了类变量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 :(得分: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(){
}
});
希望这会对你有所帮助。