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);
}
});