从FirebaseJobDispatcher迁移到AndroidX Workmanager时:如何在startWork中返回ListenableFuture?

时间:2019-05-16 08:02:08

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

因此,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并返回了一个布尔值代表工作是否还在进行。感谢您的帮助

1 个答案:

答案 0 :(得分: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中对此进行了记录。