在上传完成之前调用 Firebase Storage onSuccess

Posted

技术标签:

【中文标题】在上传完成之前调用 Firebase Storage onSuccess【英文标题】:Firebase Storage onSuccess called before upload is complete 【发布时间】:2018-10-23 11:34:40 【问题描述】:

我正在使用 Firebase 存储来保存照片。但是我的 onSuccess 在上传完成之前就被调用了

错误:

 java.lang.IllegalStateException: Task is not yet complete
        at com.google.android.gms.common.internal.Preconditions.checkState(Unknown Source)
        at com.google.android.gms.tasks.zzu.zzdq(Unknown Source)
        at com.google.android.gms.tasks.zzu.getResult(Unknown Source)
        at in.sekreative.sekreative.ui.auth.AuthActivity$uploadPhotoAndRegister$2.onSuccess(AuthActivity.kt:133)
        at in.sekreative.sekreative.ui.auth.AuthActivity$uploadPhotoAndRegister$2.onSuccess(AuthActivity.kt:24)
        at com.google.firebase.storage.zzj.zza(Unknown Source)
        at com.google.firebase.storage.zzaa.run(Unknown Source)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6123)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)

代码

val storage = FirebaseStorage.getInstance().reference
storage.child("images/profile/$mAuth.currentUser?.uid.jpg").putBytes(data)
        .addOnProgressListener 
            val progress = 100.0 * it.bytesTransferred / it.totalByteCount
            dialog.incrementProgress(progress.toInt())
        
        .addOnSuccessListener 
            user.profile = it.storage.downloadUrl.result.toString()
            registerDataWithoutPhoto(user)
        
        .addOnFailureListener 
            toast("Error uploading photo. You can update your profile pic later in the profile section.")
            registerDataWithoutPhoto(user)
        

为什么在任务完成之前调用成功监听器?

仅供参考:之前几次都运行良好。这是一个突然的错误。

【问题讨论】:

continueWithTask 【参考方案1】:

it.storage.downloadUrl (javadoc) 返回一个仅在参考的下载 URL 可用后才完成的任务。您的代码不会等待该任务完成。相反,它试图立即获得结果,并且该访问引发了异常。相反,您应该在该任务上使用侦听器,就像使用 putBytes 返回的任务一样。

【讨论】:

以上是关于在上传完成之前调用 Firebase Storage onSuccess的主要内容,如果未能解决你的问题,请参考以下文章

用于 firebase_storage 的 Flutter OnProgressListener?

Flutter firebase setData()函数在完成异步函数之前将空值分配给字段

Firebase E/StorageException:发生了 StorageException。对象在该位置不存在

未调用 Firebase 存储完成处理程序

仅在 firebase 调用完成时加载布局

从firebase调用数据需要完成处理程序?