Android Firebase存储等待侦听器
我有一个函数(不是在活动中),它将图像上传到firebase存储并返回url。 我的问题是,我需要等待上传任务完成,否则它将返回空字符串Android Firebase存储等待侦听器,android,task,firebase-storage,Android,Task,Firebase Storage,我有一个函数(不是在活动中),它将图像上传到firebase存储并返回url。 我的问题是,我需要等待上传任务完成,否则它将返回空字符串 public String pushRegisterImage(Bitmap image) { StorageReference imagesRef = storage.getReferenceFromUrl(STORAGE_REF) .child(FINDMYPET).child(IMAGES).child(String.v
public String pushRegisterImage(Bitmap image) {
StorageReference imagesRef = storage.getReferenceFromUrl(STORAGE_REF)
.child(FINDMYPET).child(IMAGES).child(String.valueOf(UUID.randomUUID()));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] data = baos.toByteArray();
UploadTask uploadTask = imagesRef.putBytes(data);
uploadTask.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
imageUrl = null;
Log.e(LOG_TAG, "Image upload error: " + e);
}
}).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
imageUrl = taskSnapshot.getDownloadUrl().toString();
Log.v(LOG_TAG, "Image uploade sucess, url: " + imageUrl);
}
});
return imageUrl;
}
公共字符串pushRegisterImage(位图图像){
StorageReference imagesRef=storage.getReferenceFromUrl(storage\u REF)
.child(findType).child(IMAGES).child(String.valueOf(UUID.randomUUID());
ByteArrayOutputStream bas=新的ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG,100,baos);
字节[]数据=baos.toByteArray();
UploadTask UploadTask=imagesRef.putBytes(数据);
uploadTask.addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
imageUrl=null;
Log.e(Log_标签,“图像上传错误:”+e);
}
}).addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公共无效(UploadTask.TaskSnapshot TaskSnapshot){
imageUrl=taskSnapshot.getDownloadUrl().toString();
Log.v(Log_标签,“图像上传成功,url:+imageUrl”);
}
});
返回imageUrl;
}
您正在尝试将数据同步放入Firebase(并等待结果),但与Android SDK提供的Firebase数据库的所有交互都是异步的(这是一个实时数据库,与“同步”的东西不匹配),因此您的返回问题没有解决方案
所以,您的问题的答案是重新思考您的代码,并记住Firebase的所有内容都是异步的,请使用
com.google.android.gms.tasks.tasks.wait(uploadTask)代码>如此处所述:。这解决了我的问题(我需要一个接一个地上传更多文件)。此外,这并不打算在UIThread上运行,因此请创建一个异步任务或类似的任务
final UploadTask uploadTask
=FirebaseStorage.getInstance().getReference("...").putFile(path);
try {
com.google.android.gms.tasks.Tasks.await(uploadTask);
} catch (ExecutionException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.d("Upload", "upload took " + (System.currentTimeMillis() - start));
我遇到了同样的问题:最适合我的解决方案是使用和
这里是代码的一个片段,它为我完成了任务。这里的原木是从哪里来的。它在任务完成后,但在worker返回成功之前,以字符串形式从Firebase返回下载URL
@NonNull
@凌驾
公共成果工作(){
mFirebaseStorage=mFirebaseStorage.getInstance();
mTriviaImageStorageReference=mFirebaseStorage.getReference().child(“图像”);
CountDownLatch countDown=新的CountDownLatch(2);
Uri imageUri=Uri.parse(getInputData().getString(KEY_IMAGE_Uri));
试一试{
//获取图像引用
final-storagereferef=mTriviaImageStorageReference.child(imageUri.getLastPathSegment());
//将图像上载到Firebase
imageRef.putFile(imageUri).continueWithTask(新的Continuation(){
@凌驾
公共任务(@NonNull Task Task)引发异常{
如果(!task.issusccessful()){
抛出task.getException();
}
倒计时;
返回imageRef.getDownloadUrl();
}
}).addOnCompleteListener(新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
Timber.d(“图像已成功上传至Firebase”);
Uri downloadUri=task.getResult();
字符串imageUrl=downloadUri.toString();
d((“图像的URl为:“+imageUrl”);
mOutputData=new Data.Builder()
.putString(键\u FIREBASE\u图像\u URL,图像URL)
.build();
倒计时;
}否则{
Toast.makeText(getApplicationContext(),“上载失败”,Toast.LENGTH_SHORT.show();
倒计时;
}
}
});
倒计时;
返回Result.success(mOutputData);
}捕捉(可抛可抛){
Timber.e(可丢弃,“错误上载图像”);
返回Result.failure();
}
}