【发布时间】:2018-05-24 16:59:02
【问题描述】:
我正在使用 Firebase Auth API 和 Google play-services Task API。
我有这个案例,有一个简单的任务链。我会将此链置于超时情况:例如,对于连接性较差的情况,如果经过 5 秒且链未完成,我将停止该链。
我知道 await() 方法,但它在后台工作,并且不会在超时后立即取消。
停止(或取消)链条的最佳方法是什么?如何重新安排?
Task<Boolean> loginTask = delay(4000)
.continueWithTask(task -> authManager.signInWithEmailAndPasswordTask("mymail", "mypass"))
.continueWithTask(task -> setUserMailFirebase(task.getResult().getUser().getEmail()))
.continueWithTask(task -> delay(4000))
.continueWithTask(task -> setUserInfoFirebase())
.continueWithTask(task -> delay(4000));
loginTask.addOnSuccessListener(this, booleanTask -> goToActivity(true))
.addOnFailureListener(this, booleanTask -> goToActivity(false));
【问题讨论】:
-
从其中一项任务中抛出异常。
-
带有 throw new Exception() 或 TaskCompletionSource.setException?但是如果我在 setUserMailFirebase 上抛出一个异常,链会被打断,会被调用 onFailureListener?
-
我怀疑任何一个都可以工作,具体取决于您执行任务的方式。关键是异常应该立即传播到最上面的任务,而不允许其他任务运行。
-
嗨,Doug,我也认为是这样。例如,如果我有一个自定义任务并且如果我设置了 TaskCompletionSource.setException,则下一个任务将使用 task.isSuccessfull() = false 执行,因此如果前一个任务有异常,我必须检查每个任务。我认为最好的行为可能是不会执行以下任务,就像 Promises 方式一样。
-
无论如何,您都应该检查每个任务处理程序中的错误。
标签: android firebase functional-programming task