【问题标题】:Getting "Task is not yet complete" error when uploading file to Firebase Storage将文件上传到 Firebase 存储时出现“任务尚未完成”错误
【发布时间】:2021-10-06 23:03:08
【问题描述】:

所以我做了一个应用程序,用户可以提供图像和描述形式的数据,然后这些数据将上传到 Firestore,并将图像保存到 Firebase Storage。运行后,镜像成功保存到 Firebase 存储,但 Firestore 中的数据没有变化。 我使用此代码:

val filePathAndName="product_images/"+""+timeStamp

val storageReference=FirebaseStorage.getInstance().getReference(filePathAndName)

val uploadTask= storageReference.putFile(image_Uri)
    uploadTask.addOnSuccessListener {  taskSnapShot->
        val uriTask=taskSnapShot.storage.downloadUrl

        val downloadImageUri=uriTask.result

        val item = Item(
            ""+firebaseAuth.uid,
            timeStamp,
            kategori,
            berat_sampah.toDouble(),
            deskripsi,
            ""+downloadImageUri,
        )
        FirestoreClass().addItem(this@AddProductActivity, FirestoreClass().getCurrentUserID(),item)

在我的 FirestoreClass 中:

class FirestoreClass {

    private  val mFireStore=FirebaseFirestore.getInstance()
    fun addItem(activity: AddProductActivity, userId: String, itemInfo: Item){
        mFireStore.collection(Constants.USERS).document(userId)
            .collection(Constants.PRODUCT).document(itemInfo.productId)
            .set(itemInfo, SetOptions.merge())
    }

    fun getCurrentUserID(): String{
        val currentUser= FirebaseAuth.getInstance().currentUser
        var currentUserID=""
        if(currentUser!=null)
        {
            currentUserID=currentUser.uid
        }
        return currentUserID
    }

    }

好像是图片上传到Storage之后,activity被强行关闭了。并显示此错误:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.b1, PID: 15693
    java.lang.IllegalStateException: Task is not yet complete
        at com.google.android.gms.common.internal.Preconditions.checkState(com.google.android.gms:play-services-basement@@17.1.0:29)
        at com.google.android.gms.tasks.zzu.zzb(Unknown Source:121)
        at com.google.android.gms.tasks.zzu.getResult(Unknown Source:12)
        at com.example.b1.activity.AddProductActivity$addProduct$1.onSuccess(AddProductActivity.kt:163)
        at com.example.b1.activity.AddProductActivity$addProduct$1.onSuccess(AddProductActivity.kt:35)
        at com.google.firebase.storage.StorageTask.lambda$new$0$StorageTask(StorageTask.java:123)
        at com.google.firebase.storage.-$$Lambda$StorageTask$xlHsb5OfSRp-di5vg8sdDdXsCO4.raise(Unknown Source:6)
        at com.google.firebase.storage.TaskListenerImpl.lambda$onInternalStateChanged$2$TaskListenerImpl(TaskListenerImpl.java:90)
        at com.google.firebase.storage.-$$Lambda$TaskListenerImpl$S8elBxPWPDCBbbHv0Z6yA1jvX68.run(Unknown Source:6)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

为什么会这样?错误中提到的尚未完成的任务是什么

【问题讨论】:

    标签: firebase kotlin firebase-storage


    【解决方案1】:

    我认为问题可能来自这里:

    val uriTask=taskSnapShot.storage.downloadUrl
    
    val downloadImageUri=uriTask.result
    

    downloadUrl 属性实际上是一个异步方法调用。所以你不能只从任务中得到结果,而是必须等待它——类似于你已经为putFile()所做的。

    类似这样的:

    taskSnapShot.storage.downloadUrl.addOnSuccessListener { task ->
        val downloadUri = task.result
        // Use the downloadUri here
    }
    

    另请参阅 getting the download URL for an uploaded file 上的 Firebase 文档中的示例。

    【讨论】:

      猜你喜欢
      • 2021-08-17
      • 2016-09-18
      • 1970-01-01
      • 2021-01-07
      • 2017-01-11
      • 2019-03-15
      • 2020-04-23
      • 2018-12-21
      • 2020-10-25
      相关资源
      最近更新 更多