android - Worker 内部的 Synchronous 或 Asynchronous Rxjava(来自 WorkManager 组件)什么是正确的选择?

标签 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;
  }

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

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

最佳答案

自 WorkManager 版本 1.0.0-alpha12他们添加了一个名为 work-rxjava2 的新 Artifact 其中包括 RxWorker 正是为了这个目的而上课。它是 ListenableWorker 的特例期待 Single<Result> .

要实现它,首先要确保您的 build.gradle 中包含正确的 Artifact 。 :

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() }
    }
}

关于android - Worker 内部的 Synchronous 或 Asynchronous Rxjava(来自 WorkManager 组件)什么是正确的选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51756305/

相关文章:

java - JSP中如何调用类方法?

mvvm - 为什么在观察LiveData时未调用onChanged()

android - 小部件数据在运行繁重的应用程序时丢失

java - 在 AsyncTask 中使用从 LoaderManager 返回的 Cursor

android - Room flowable调用多次

java - 创建一个以有限速率发出项目的 Flowable,以避免需要缓冲事件

android - 用于位置跟踪的前台服务与 WorkManager

屏幕旋转后 Android Arch 组件 ViewModel 和 LiveData 触发

java - 为什么播放mp3会强制崩溃?

java - 如何创建接受值数组的类构造函数?