从 FirebaseJobDispatcher 迁移到 AndroidX Workmanager 时:如何在 startWork 中返回 ListenableFuture? [复制]
Posted
技术标签:
【中文标题】从 FirebaseJobDispatcher 迁移到 AndroidX Workmanager 时:如何在 startWork 中返回 ListenableFuture? [复制]【英文标题】:When migrating from FirebaseJobDispatcher to AndroidX Workmanager: How do I return a ListenableFuture in startWork? [duplicate] 【发布时间】:2019-10-03 10:41:43 【问题描述】:因此,documentation Firebase JobDispatcher 已被弃用,应迁移以使用 WorkManager。我在关注migration guide,它说在 JobService 中实现的功能应该迁移到 ListenableWorker。但是我对如何实现startWork()
感到困惑,该指南只说
override fun startWork(): ListenableFuture<ListenableWorker.Result>
// Do your work here.
TODO("Return a ListenableFuture<Result>")
我已经做了很多谷歌搜索,但我无法弄清楚如何在这种情况下实现/使用 ListenableFuture 来实现 JobService 的功能,我在其中调用了 jobFinished
并返回了一个布尔值来表示如果工作还在继续。任何帮助表示赞赏
【问题讨论】:
这个问题在这里得到了回答:***.com/questions/56176554/… 【参考方案1】:如果需要执行异步代码,则需要使用 ListenableWorker。 有一个 Threading in ListenableWorker documentation page 涵盖了这个:
如果你想基于异步回调执行一些工作,你可以这样做:
public class CallbackWorker extends ListenableWorker public CallbackWorker(Context context, WorkerParameters params) super(context, params); @NonNull @Override public ListenableFuture<Result> startWork() return CallbackToFutureAdapter.getFuture(completer -> Callback callback = new Callback() int successes = 0; @Override public void onFailure(Call call, IOException e) completer.setException(e); @Override public void onResponse(Call call, Response response) ++successes; if (successes == 100) completer.set(Result.success()); ; for (int i = 0; i < 100; ++i) downloadAsynchronously("https://www.google.com", callback); return callback; );
如果您使用的是 kotlin,一个更简单的替代方法是使用 CoroutineWorker
类。
如果您需要执行的是同步的,则使用 Worker
类可能更简单,并且足以满足您的用例。这记录在Threading in Worker。
【讨论】:
这个例子确实不完整且具有误导性。虽然文档声明使用 Callback future 足以在可侦听的工作线程中进行线程化,但显然情况并非如此,因为 startWork 确实在主线程上被调用 非常感谢在可侦听的工作线程中展示使用线程的正确方法,因为大多数 API 调用或 SDK 都有异步方法以上是关于从 FirebaseJobDispatcher 迁移到 AndroidX Workmanager 时:如何在 startWork 中返回 ListenableFuture? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
FirebaseJobDispatcher onStopJob 未触发
为啥 Firebase JobDispatcher 运行 JobService 2 次?