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

Moh*_*him 18 android rx-java2 android-architecture-components android-jetpack android-workmanager

我是新架构组件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;
  }
Run Code Online (Sandbox Code Playgroud)

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

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

Sem*_*cer 26

从WorkManager版本开始,1.0.0-alpha12他们添加了一个名为work-rxjava2包含RxWorker完全用于此目的的类的新工件.这是一个ListenableWorker期待的特例Single<Result>.

要实现它,首先要确保包含正确的工件build.gradle:

dependencies {
   ...
   implementation "android.arch.work:work-runtime-ktx:1.0.0-beta01"
   implementation "android.arch.work:work-rxjava2:1.0.0-beta01"
}
Run Code Online (Sandbox Code Playgroud)

并实施您的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() }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 远程服务只是一些示例服务,您可以使用它来返回封装在 Single 类型中的某些值。 (2认同)

Rah*_*hul 6

编辑: WorkManager现在正式支持RxWorker.请查看上面的答案以获取更多信息.

doWork发生在后台线程上.所以阻止它是安全的.Observable在返回之前,您应该等待完成Result.

我们还在努力使用异步API使这更容易.敬请关注.