Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Firebase存储等待侦听器_Android_Task_Firebase Storage - Fatal编程技术网

Android Firebase存储等待侦听器

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

我有一个函数(不是在活动中),它将图像上传到firebase存储并返回url。 我的问题是,我需要等待上传任务完成,否则它将返回空字符串

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