Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 确保RxWorker从不出现故障_Android_Kotlin_Rx Java_Android Workmanager - Fatal编程技术网

Android 确保RxWorker从不出现故障

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,我无法覆盖它 那么,如何确保我的工作进程不会失败呢?在

我正在实现我的第一个WorkManager,以便与服务器进行每日同步,这可能会返回HTTP错误,从而使createWork流失败,并调用OneError,从而在流的订阅中抛出Result.failure

我想确保从不调用Result.failure,而是始终调用Result.retry

这是我的RxWorker

我尝试在流的许多不同onError中调用Result.retry,但似乎在订阅的onError中调用了Result.failure,我无法覆盖它

那么,如何确保我的工作进程不会失败呢?

在Syncwith Server函数中,您只能在flatMap部分检查结果。但是,在某些情况下,在到达flatMap部件之前可能会发生错误,这意味着可能永远不会返回Result.retry。另外,默认情况下,当工作线程在后台线程上运行时,您不需要指定特定的线程。这是我在上面提到的您的工人的变化:

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