Worker(来自WorkManager组件)中的同步或异步Rxjava,什么是正确的选择?

穆罕默德·易卜拉欣

我是新架构组件WorkManager的新手,我通过Retrofit和RxJava进行API调用。

我的用例是从后端获取新帖子,然后显示通知并更新小部件。

因此,Worker类的doWork()方法中的代码可能看起来像这样。

@NonNull
  @Override
  public Result doWork() {
    AppDependencies appDependencies = new AppDependencies((Application) getApplicationContext());
    Repository repository = appDependencies.getRepository();

    repository.getNewPosts()
        .flatMap(newPosts -> repository.inserPosts(newPosts).toObservable())
        .doOnError(Timber::e)
        //if success - > return  Result.SUCCESS,
        // -> show notification
        // -> update widget
        // error-> return Result.Failure
        .dontKnowWhatBestNextThing; //blocking or subscribing

    //if we reached here then Retry
    return Result.RETRY;
  }

我的问题是在Worker类中使用RxJava代码的正确方法是什么,因为doWork()方法具有返回值,所以我必须使Rx代码同步。

如果我使用非阻塞Rx方法,如何返回值(成功-失败-重试)

语义器

从WorkManager版本开始,1.0.0-alpha12他们添加了一个名为的新工件work-rxjava2RxWorker正是为此目的包括了类。这是ListenableWorker期望的特例Single<Result>

要实现它,首先要确保在您的产品中包含正确的工件build.gradle

dependencies {
   ...
   implementation "android.arch.work:work-runtime-ktx:$work_version"
   implementation "android.arch.work:work-rxjava2:$work_version"
}

并实现您的RxWorker

class MyRxWorker(context : Context, params : WorkerParameters) : RxWorker(context, params) {

    val remoteService = RemoteService()

    override fun createWork(): Single<Result> {
        return remoteService.getMySingleResponse()
                .doOnSuccess { /* process result somehow */ }
                .map { Result.success() }
                .onErrorReturn { Result.failure() }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在库中实现同步和异步方法的正确方法是什么?

什么是Android中的同步和异步?

在RxJava中,什么算作异步边界?

在一种方法中调用同步和异步方法(api / UI)的正确方法是什么

意图在android中是异步的。为什么不能同步呼叫?

为什么在以下程序中在同步之前调用异步功能?

Android WorkManager中的异步工作者

为什么异步等待任务中的同步代码比异步代码慢得多

正确结合异步和同步函数结果

来自CloudKit的推送通知未正确同步

RxJS中的同步与异步序列

异步函数中的同步异常

异步@RabbitListener中的同步代码?

NodeJS中的异步Vs同步

在单元测试中同步调用异步方法是否不正确?

选择在有状态组件中调用函数的正确方法

在python / django中异步发送邮件的正确方法是什么?

React Hooks:在组件内部处理异步setState的正确方法是什么?(uploadProgress axios)

Android中的RxJava异步任务

在ReactJS中验证来自后端的数据的正确位置是什么?

当您在Swift中的同步队列中异步调度任务时会发生什么?

为什么画布绘制是异步的,而 API 是同步的?

异步与同步执行的真正含义是什么?

nsurlconnection默认是什么?同步还是异步?

为什么异步超过同步功能?

异步委托-什么是正确的方法

如何在Android的WorkManager中创建带有参数的Worker?

在 NextJS 组件中执行 `onClick` 的正确方法是什么?

Typescript中组件的React实例的正确类型是什么