【发布时间】:2020-01-03 15:05:19
【问题描述】:
我正在实现我的第一个 WorkManager 用于与服务器的每日同步,这可能会返回 HTTP 错误,因此使 createWork() 流失败并调用 onError() 所以 Result.failure() 被“抛出”在流的订阅。
我想确保永远不会调用 Result.failure() 并始终调用 Result.retry()。
这是我的RxWorker
class DailySyncWorker (appContext: Context, workerParams: WorkerParameters): RxWorker(appContext, workerParams) {
private val disposable: CompositeDisposable = CompositeDisposable()
private val httpManager = AppFactory.httpManager()
private val dbManager = AppFactory.dbManager()
private val prefsManager = AppFactory.sharedManager(appContext)
companion object {
const val WORKER_NAME = "com.blabla.blah.DAILY_SYNC_WORKER"
}
override fun createWork(): Single<Result> {
Timber.e("Worker - Executing ${System.currentTimeMillis() - prefsManager.lastMillis}")
prefsManager.lastMillis = System.currentTimeMillis()
return dbManager.alarmDAO.getNewAlarms(prefsManager.lastSyncedAlarm)
.flatMap { alarms -> syncWithServer(alarms)
.doOnSuccess {
if(alarms.size != 0)
prefsManager.lastSyncedAlarm = alarms[0].date // The query is in descending order, the first record is the last recorded alarm
}
}
}
private fun syncWithServer(alarms: MutableList<Alarm>): Single<Result> {
val syncRequestModel = SyncRequestModel(alarms)
return if(alarms.size != 0)
httpManager.service().create(SyncService::class.java).sync(syncRequestModel)
.observeOn(Schedulers.io())
.flatMap { result ->
if(result == "OK") { // TODO - the service has not been created yet
Timber.e("Worker - success")
Single.just(Result.success())
} else {
Timber.e("Worker - failure")
Single.just(Result.retry())
}
}
else {
Timber.e("Worker - no sync is necessary")
Single.just(Result.success())
}
}
}
我尝试在流的许多不同onError() 中调用Result.retry(),但似乎Result.failure() 正在我无法覆盖的订阅的onError() 中调用。
那么我怎样才能确保我的工人永远不会失败呢?
【问题讨论】:
-
使用 onErrorXXX,可能与stackoverflow.com/questions/28969995/…重复
标签: android kotlin rx-java android-workmanager