【问题标题】:When migrating from FirebaseJobDispatcher to AndroidX Workmanager: How do I return a ListenableFuture in startWork? [duplicate]从 FirebaseJobDispatcher 迁移到 AndroidX Workmanager 时:如何在 startWork 中返回 ListenableFuture? [复制]
【发布时间】:2023-03-10 22:46:01
【问题描述】:

因此,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 并返回了一个布尔值来表示如果工作还在继续。任何帮助表示赞赏

【问题讨论】:

标签: android android-workmanager firebase-job-dispatcher


【解决方案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 都有异步方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-03
相关资源
最近更新 更多