【发布时间】:2016-10-20 17:57:07
【问题描述】:
【问题讨论】:
【问题讨论】:
有几种方法可以使用 Play services Task API 创建自定义任务。
首先是Tasks.call(Callable)。您传递的 Callable 被安排在主线程上立即执行,并且您将获得一个 Task 作为回报,并带有 Callable 的返回类型的泛型参数。此任务使用该返回值成功解析,如果 Callable 抛出异常则错误。
另一个方法是Tasks.call(Executor, Callable),它和另一个方法完全一样,除了给定的可调用对象被安排在由给定Executor管理的线程上立即执行。您可以自行决定寻找或创建适合您工作的 Executor。
最后,还有TaskCompletionSource,它允许您创建一个任务,并根据与任务不直接相关的其他一些工作项的结果手动将其解决为成功或失败。
有关更多详细信息,请查看我关于任务的博客系列。我在part three 和part four 中介绍了这些方法。
【讨论】:
假设你有一个Document 类,你可以这样做:
Tasks.<Document>forResult(document);
Tasks.forException(new RuntimeException("Cool message"));
interface CreateDocument extends Callable<Document> {
@Override
Document call();
}
Tasks.call(new CreateDocument());
Task<Document> createDocument() {
TaskCompletionSource<Document> tcs = new TaskCompletionSource();
if (this.someThingGoesWrong()) {
tcs.setException(new RuntimeException("Cooler message"));
} else {
tcs.setResult(Document.factory());
}
tcs.getTask();
}
【讨论】: