从 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

为啥 Firebase JobDispatcher 运行 JobService 2 次?

浪潮发布“惠”迁计划 直指高端Unix服务器市场第二

Firebase Jobdispatcher - 现在开始并重复

Firebase jobdispatcher 未在指定窗口内触发