Android 确保RxWorker从不出现故障
我正在实现我的第一个WorkManager,以便与服务器进行每日同步,这可能会返回HTTP错误,从而使createWork流失败,并调用OneError,从而在流的订阅中抛出Result.failure 我想确保从不调用Result.failure,而是始终调用Result.retry 这是我的RxWorker 我尝试在流的许多不同onError中调用Result.retry,但似乎在订阅的onError中调用了Result.failure,我无法覆盖它 那么,如何确保我的工作进程不会失败呢?在Syncwith Server函数中,您只能在flatMap部分检查结果。但是,在某些情况下,在到达flatMap部件之前可能会发生错误,这意味着可能永远不会返回Result.retry。另外,默认情况下,当工作线程在后台线程上运行时,您不需要指定特定的线程。这是我在上面提到的您的工人的变化:Android 确保RxWorker从不出现故障,android,kotlin,rx-java,android-workmanager,Android,Kotlin,Rx Java,Android Workmanager,我正在实现我的第一个WorkManager,以便与服务器进行每日同步,这可能会返回HTTP错误,从而使createWork流失败,并调用OneError,从而在流的订阅中抛出Result.failure 我想确保从不调用Result.failure,而是始终调用Result.retry 这是我的RxWorker 我尝试在流的许多不同onError中调用Result.retry,但似乎在订阅的onError中调用了Result.failure,我无法覆盖它 那么,如何确保我的工作进程不会失败呢?在
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
}
}
.onErrorReturnItem(Result.retry()) // Here is error handling
}
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)
.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())
}
}
}
使用OneRorXXX,可能是
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
}
}
.onErrorReturnItem(Result.retry()) // Here is error handling
}
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)
.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())
}
}
}