Android 为什么不是';当从Firebase中检索到我的图像时,它是否已成功上载?

Android 为什么不是';当从Firebase中检索到我的图像时,它是否已成功上载?,android,firebase,android-layout,firebase-realtime-database,Android,Firebase,Android Layout,Firebase Realtime Database,这是我的代码。 private void uploadPattern() { if (mImageUri != null) { final StorageReference fileReference = mStorageRef.child(System.currentTimeMillis() + "." + getFileExtension(mImageUri)); mUploadTask = fileReference.put

这是我的代码。

private void uploadPattern() {
        if (mImageUri != null) {
            final StorageReference fileReference = mStorageRef.child(System.currentTimeMillis() + "." + getFileExtension(mImageUri));

            mUploadTask = fileReference.putFile(mImageUri)
                    .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {

                    Handler handler = new Handler();
                    handler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            mProgressBar.setProgress(0);
                        }
                    }, 500);

                    Toast.makeText(PatternArranger.this, "Save Successful", Toast.LENGTH_SHORT).show();
                    //Upload upload = new Upload(mEditPatternName.getText().toString().trim(),
                            //taskSnapshot.getUploadSessionUri().toString());
                    //String uploadId = mDatabaseRef.push().getKey();
                    //mDatabaseRef.child(uploadId).setValue(upload);
                    Task<Uri> urlTask = taskSnapshot.getStorage().getDownloadUrl();
                    while ( !urlTask.isSuccessful());
                    Uri downloadUrl = urlTask.getResult();

                    //Log.d(TAG, "onSuccess: firebase download url: " + downloadUrl.toString()); //use if testing...don't need this line.
                    Upload upload = new Upload(mEditPatternName.getText().toString().trim(),downloadUrl.toString());

                    String uploadId = mDatabaseRef.push().getKey();
                    mDatabaseRef.child(uploadId).setValue(upload);
                }
            })
                    .addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            Toast.makeText(PatternArranger.this, e.getMessage(), Toast.LENGTH_SHORT).show();
                        }
                    })
                    .addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
                        @Override
                        public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
                            double progress = (100.0 * taskSnapshot.getBytesTransferred() / taskSnapshot.getTotalByteCount());
                            mProgressBar.setProgress((int) progress);
                        }
                    });
        } else {
            Toast.makeText(this, "No pattern selected", Toast.LENGTH_SHORT).show();
        }
    }
private void uploadPattern(){
if(mimageri!=null){
final-StorageReference-fileReference=mStorageRef.child(System.currentTimeMillis()+“+”+getFileExtension(mimageri));
mUploadTask=fileReference.putFile(mimageri)
.addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公共无效(UploadTask.TaskSnapshot TaskSnapshot){
Handler=newhandler();
handler.postDelayed(新的Runnable(){
@凌驾
公开募捐{
mProgressBar.setProgress(0);
}
}, 500);
Toast.makeText(PatternArranger.this,“保存成功”,Toast.LENGTH_SHORT.show();
//Upload Upload=新上载(mEditPatternName.getText().toString().trim(),
//taskSnapshot.getUploadSessionUri().toString());
//字符串uploadId=mDatabaseRef.push().getKey();
//mDatabaseRef.child(uploadId).setValue(upload);
Task urlTask=taskSnapshot.getStorage().getDownloadUrl();
而(!urlTask.issusccessful());
Uri downloadUrl=urlTask.getResult();
//Log.d(标记“onSuccess:firebase下载url:”+downloadUrl.toString());//在测试时使用……不需要此行。
Upload Upload=新上载(mEditPatternName.getText().toString().trim(),downloadUrl.toString());
字符串uploadId=mDatabaseRef.push().getKey();
mDatabaseRef.child(uploadId).setValue(upload);
}
})
.addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
Toast.makeText(PatternArranger.this,e.getMessage(),Toast.LENGTH_SHORT).show();
}
})
.addOnProgressListener(新的OnProgressListener(){
@凌驾
public void onProgress(UploadTask.TaskSnapshot TaskSnapshot){
双进度=(100.0*taskSnapshot.GetByTestTransferred()/taskSnapshot.getTotalByteCount());
mProgressBar.setProgress((int)progress);
}
});
}否则{
Toast.makeText(这是“未选择图案”,Toast.LENGTH_SHORT).show();
}
}

通过使用
while
循环,您可能会错过解决问题的重要调试信息。在您的代码中,
urlTask
可能已失败,
urlTask.issusccessful()
将永远不会计算为true,这将导致无限循环

Task<Uri> urlTask = taskSnapshot.getStorage().getDownloadUrl();
while ( !urlTask.isSuccessful());
Task urlTask=taskSnapshot.getStorage().getDownloadUrl();
而(!urlTask.issusccessful());
要解决此问题,请将侦听器正确连接到每个操作返回的,并记录其结果

taskSnapshot.getStorage().getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
    @Override
    public void onSuccess(Uri downloadUri) {
      Log.d(TAG, "getDownloadUrl.onSuccess: obtained download URI: " + downloadUri.toString());
      Upload upload = new Upload(mEditPatternName.getText().toString().trim(),downloadUri.toString());

      String uploadId = mDatabaseRef.push().getKey();

      mDatabaseRef.child(uploadId).setValue(upload)
        .addOnSuccessListener(new OnSuccessListener() {
            @Override
            public void onSuccess() {
              Log.d(TAG, "setValue.onSuccess: uploaded & saved to database");
              // TODO: Update UI to show image/completion message
            }
        })
        .addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception exception) {
              // Handle any errors
              Log.d(TAG, "setValue.onFailure: error occured - " + exception.message);
            }
        });
    }
}).addOnFailureListener(new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception exception) {
      // Handle any errors
      Log.d(TAG, "getDownloadUrl.onFailure: error occured - " + exception.message);
    }
});
taskSnapshot.getStorage().getDownloadUrl().addOnSuccessListener(新OnSuccessListener()){
@凌驾
成功时公共无效(Uri下载Uri){
Log.d(标记“getDownloadUrl.onSuccess:获取的下载URI:”+downloadUri.toString());
Upload Upload=新上载(mEditPatternName.getText().toString().trim(),downloadUri.toString());
字符串uploadId=mDatabaseRef.push().getKey();
mDatabaseRef.child(uploadId).setValue(upload)
.addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时的公共无效(){
Log.d(标记“setValue.onSuccess:上传并保存到数据库”);
//TODO:更新UI以显示图像/完成消息
}
})
.addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常){
//处理任何错误
Log.d(标记“setValue.onFailure:发生错误-”+异常.message);
}
});
}
}).addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常){
//处理任何错误
Log.d(标记“getDownloadUrl.onFailure:发生错误-”+异常.message);
}
});