Android 如何取消firebase StorageTask?

Android 如何取消firebase StorageTask?,android,firebase,kotlin,firebase-storage,Android,Firebase,Kotlin,Firebase Storage,我正在将一些图像上载到firebase存储,每当单击“取消”按钮时,我都需要取消该过程,但我无法处理取消操作,应用程序崩溃。以下是我的代码和logcat错误: 代码: buttonCancel.setOnClickListener{ uploadTask.cancel() } val storageRef = FirebaseStorage.getInstance().reference for (path in pathsList){ val imgRef = st

我正在将一些图像上载到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
        }
}
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.
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
        }
}
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循环中执行此操作的,我不知道这可能会产生差异)

在失败上载时执行此操作做你想做的事

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();
        }
    });
uploadTask.addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公共无效(UploadTask.TaskSnapshot TaskSnapshot){
uploadTask.continueWithTask(新的Continuation(){
@凌驾
公共任务(@NonNull Task Task)引发异常{
如果(!task.issusccessful()){
抛出task.getException();
}
返回postmageuri.getDownloadUrl();
}
}).addOnCompleteListener(新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
Uri downloadUri=task.getResult();
//获取url
}
}
}).addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
//无法获取url
}
});
}
}).addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
//在这里你会得到例外
e、 printStackTrace();
}
});

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


有关任务如何工作的更多详细信息,请阅读。

日志中的完整错误是什么,而不仅仅是第一行?它在你的代码中指向哪一行?@DougStevenson我更新了帖子很抱歉它没有捕捉到异常。这是不是
try{throw e}catch(例如:Exception){}
正确的方法?