我是新架构组件 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/