【问题标题】:Android Google Task API - Interrupt chainAndroid Google Task API - 中断链
【发布时间】: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


【解决方案1】:

试试这段代码,但记得在与 loginTask 不同的线程上运行它

try {
    Tasks.await(loginTask, 5, TimeUnit.SECONDS);
}
catch(Exception e) {
    loginTask.setException(e);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    相关资源
    最近更新 更多