【问题标题】:How to create custom tasks for Firebase using the Google Play services Task API如何使用 Google Play 服务 Task API 为 Firebase 创建自定义任务
【发布时间】:2016-10-20 17:57:07
【问题描述】:

我想在firebase 中创建自定义tasks,以便链接我的API 异步调用。我怎样才能做到这一点?

【问题讨论】:

标签: android firebase


【解决方案1】:

有几种方法可以使用 Play services Task API 创建自定义任务。

首先是Tasks.call(Callable)。您传递的 Callable 被安排在主线程上立即执行,并且您将获得一个 Task 作为回报,并带有 Callable 的返回类型的泛型参数。此任务使用该返回值成功解析,如果 Callable 抛出异常则错误。

另一个方法是Tasks.call(Executor, Callable),它和另一个方法完全一样,除了给定的可调用对象被安排在由给定Executor管理的线程上立即执行。您可以自行决定寻找或创建适合您工作的 Executor。

最后,还有TaskCompletionSource,它允许您创建一个任务,并根据与任务不直接相关的其他一些工作项的结果手动将其解决为成功或失败。

有关更多详细信息,请查看我关于任务的博客系列。我在part threepart four 中介绍了这些方法。

【讨论】:

  • 谢谢。我稍后会测试一下。你介意谈谈 Tasks.forException() 和 Tasks.forResult() 吗?小例子也不错。
  • 那些只是创建已经解决给定结果或异常的任务。您可能永远不会使用它们,但当您需要具有已知值的任务时,它可以方便地进行测试。
  • 顺便说一句,关于这些任务的好博客!现在我明白了!您确实应该添加其他部分来讨论任务 api 的其余部分。我爱上了这个。它非常适合。我想我要重写我的 api(我正在使用改造)来支持任务。我讨厌我不得不将一个调用链接到另一个调用,而 RxJava IMO 非常复杂和丑陋。任务很漂亮哈哈。也许这对你来说也可能是一篇很好的博客文章,如何使用任务链接改造调用。只是一个建议;)
  • 虽然第 3 部分实际上就是这样。 :D
  • 其实我这里忘了说你可以使用TaskCompletionSource从其他工作源(比如RxJava observables)创建Tasks。这是博客的第 4 部分。
【解决方案2】:

假设你有一个Document 类,你可以这样做:

创建成功resolved task

Tasks.<Document>forResult(document);

创建一个failed task

Tasks.forException(new RuntimeException("Cool message"));

Callable创建

interface CreateDocument extends Callable<Document> {
    @Override
    Document call();
}
Tasks.call(new CreateDocument());

使用task completion source 创建

Task<Document> createDocument() {
    TaskCompletionSource<Document> tcs = new TaskCompletionSource();
    if (this.someThingGoesWrong()) {
        tcs.setException(new RuntimeException("Cooler message"));
    } else {
        tcs.setResult(Document.factory());
    }

    tcs.getTask();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    • 1970-01-01
    • 2017-06-15
    相关资源
    最近更新 更多