【问题标题】:How to cancel a firebase StorageTask?如何取消firebase StorageTask?
【发布时间】:2019-01-31 16:16:18
【问题描述】:

我正在将一些图像上传到 Firebase 存储,并且每当单击取消按钮时我都需要取消该过程,但我无法处理取消并且应用程序崩溃了。这是我的代码和 logcat 错误:

代码:

buttonCancel.setOnClickListener{
     uploadTask.cancel()
}

val storageRef = FirebaseStorage.getInstance().reference
for (path in pathsList){
        val imgRef = storageRef.child("${Calendar.getInstance().timeInMillis}.jpg")
        val fileUri = Uri.fromFile(File(path))
        uploadTask = imgRef.putFile(fileUri)
        try {
            uploadTask.addOnCompleteListener {
                p0 -> val downloadUri = p0.result.toString()
                //do sth with download uri
            }
        }
        catch (ex: Exception){
            Toast.makeText(this, "upload canceled", Toas.LENGHT_SHORT).show
            break
        }
}

Logcat 错误:

08-25 18:20:59.149 22419-23332/packagename E/StorageException: StorageException has occurred.
The operation was cancelled.
 Code: -13040 HttpResult: 0
08-25 18:20:59.158 22419-22419/packagename D/AndroidRuntime: Shutting down VM
08-25 18:20:59.161 22419-22419/packagename E/AndroidRuntime: FATAL EXCEPTION: main
Process: packagename, PID: 22419
com.google.android.gms.tasks.RuntimeExecutionException: com.google.firebase.storage.StorageException: The operation was cancelled.
    at com.google.firebase.storage.StorageTask.getResult(Unknown Source)
    at com.google.firebase.storage.StorageTask.getResult(Unknown Source)
    at packagename.myFragment$myMethod$1$1.onComplete(myFragment.kt:348)
    at com.google.firebase.storage.zzq.zza(Unknown Source)
    at com.google.firebase.storage.zzac.zza(Unknown Source)
    at com.google.firebase.storage.zzaf.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:6776)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1496)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386)
 Caused by: com.google.firebase.storage.StorageException: The operation was cancelled.
    at com.google.firebase.storage.UploadTask.onCanceled(Unknown Source)
    at com.google.firebase.storage.StorageTask.zza(Unknown Source)
    at com.google.firebase.storage.StorageTask.zza(Unknown Source)
    at com.google.firebase.storage.StorageTask.zzk(Unknown Source)
    at com.google.firebase.storage.StorageTask.zzl(Unknown Source)
    at com.google.firebase.storage.zzx.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
    at java.lang.Thread.run(Thread.java:762)
08-25 18:20:59.428 22419-23333/packagename E/StorageUtil: error getting token java.util.concurrent.ExecutionException: com.google.firebase.internal.api.FirebaseNoSignedInUserException: Please sign in before trying to get a token.

我怎样才能捕捉到这个异常?(请注意,我是在 for 循环中执行此操作的,我不知道这可能会有所不同)

【问题讨论】:

  • 日志中的完整错误是什么,而不仅仅是第一行?它在您的代码中指向哪些行?
  • @DougStevenson 我更新了帖子

标签: android firebase kotlin firebase-storage


【解决方案1】:

在上传失败时这样做做你想做的事

uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
        @Override
        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {

            uploadTask.continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() {
                @Override
                public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception {
                    if (!task.isSuccessful()) {
                        throw task.getException();
                    }
                    return postImageUri.getDownloadUrl();
                }
            }).addOnCompleteListener(new OnCompleteListener<Uri>() {
                @Override
                public void onComplete(@NonNull Task<Uri> task) {
                    if (task.isSuccessful()) {
                        Uri downloadUri = task.getResult();
                        //getting url
                    }
                }
            }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    //failure to get the url
                }
            });
        }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            // here you will get the exception
            e.printStackTrace();
        }
    });

【讨论】:

  • 对不起,它没有捕捉到异常。这是try{throw e}catch(ex: Exception){} 正确的做法吗?
【解决方案2】:

问题是当没有可用的结果时,您在 onCompleteListener 中调用 getResult() 。相反,您应该将 onCompleteListener(接收所有结果,包括成功和失败)替换为 onSuccessListener 和 onFailureListener。 onSuccessListener 只会接收成功的结果,因此您始终可以安全地调用 getResult() 而不会引发异常。

请阅读Play Services Task API documentation,了解有关任务工作原理的更多详细信息。

【讨论】:

    猜你喜欢
    • 2021-12-22
    • 2017-12-06
    • 2017-06-16
    • 2021-03-23
    • 1970-01-01
    • 2017-08-08
    • 2020-03-25
    • 2019-11-26
    • 2020-05-30
    相关资源
    最近更新 更多