Android rxjava2去抖动:当下一个可观测对象出现错误时,如何忽略去抖动

Android rxjava2去抖动:当下一个可观测对象出现错误时,如何忽略去抖动,android,repository-pattern,rx-java2,debounce,Android,Repository Pattern,Rx Java2,Debounce,为了使数据可以脱机查看,我有一个数据层,它首先从数据库请求数据,然后执行网络调用从api获取数据(并将数据存储到数据库)。 F.e.假设我想通过用户id获得回收分数: 数据层: class RecycleScoreRepository{ fun getRecycleScoresByUserId(userId: Int): Observable<RecycleScores> { return Observable.concatArray( get

为了使数据可以脱机查看,我有一个数据层,它首先从数据库请求数据,然后执行网络调用从api获取数据(并将数据存储到数据库)。 F.e.假设我想通过用户id获得回收分数:

数据层:

 class RecycleScoreRepository{ 

 fun getRecycleScoresByUserId(userId: Int): Observable<RecycleScores> {
    return Observable.concatArray(
            getRecycleScoresFromDb(userId),
            getRecycleScoresFromApi(userId))}
}


object RepositoryManager {

...

fun getRecycleScoresByUserId(userId: Int): Observable<RecycleScores> {

    return recycleScoreRepository.getRecycleScoresByUserId(userId)
            //Drop DB data if we can fetch item fast enough from the API to avoid UI flickers
            .debounce(400, TimeUnit.MILLISECONDS)} ...
因此,我的演示者正在订阅存储库以获取RecycleScoresByUserID。我使用debounce操作符来确保api调用足够快,不会在ui上设置两次返回值以防止ui闪烁。但是现在发生的情况是,当数据库成功地返回一些RecycleStores,但由于某种原因api请求响应出现错误时,presenter中的订阅者只接收到一个错误,而不是数据库中的可观察值


如何确保订阅服务器接收到数据库的可观测数据,并且在api调用返回错误时不会取消通知?

这可能不是最佳解决方案,但您可以在这一部分中从api可观测响应中过滤错误

fun getRecycleScoresByUserId(userId: Int): Observable<RecycleScores> {
    return Observable.concatArray(
            getRecycleScoresFromDb(userId),
            getRecycleScoresFromApi(userId)                
                .materialize()
                .filter{ !it.isOnError }
                .dematerialize<RecycleScores>()

)}
}
然后你可以像这样使用它:

fun getRecycleScoresByUserId(userId: Int): Observable<RecycleResponse> {
    return Observable.concatArray(
            getRecycleScoresFromDb(userId),
            getRecycleScoresFromApi(userId))
            .map<RecycleResponse> { RecycleResponse.OK(it) }
            .onErrorReturn { RecycleResponse.NotOK(it) }
}
fun getRecycleScoresByUserId(userId:Int):可观察{
返回可观察的concatArray(
getRecycleScoresFromDb(用户ID),
getRecycleScoresFromApi(用户ID))
.map{RecycleResponse.OK(it)}
.onErrorReturn{RecycleResponse.NotOK(it)}
}

谢谢,这已经有帮助了。唯一的问题是,我仍然需要找到一种处理错误/非200服务器响应的方法。有什么建议吗?:)我的一个想法是将您的响应包装成另一种类型来表示成功和错误响应,然后您就可以处理它了。我在回答中加了一个例子。希望它能帮助您。@Rik Van Vlzen最好从响应中获取响应代码和错误。改装响应是有帮助的。
sealed class RecycleResponse {
    class OK(val score: RecycleScore) : RecycleResponse()
    class NotOK(val error: Exception) : RecycleResponse()
}
fun getRecycleScoresByUserId(userId: Int): Observable<RecycleResponse> {
    return Observable.concatArray(
            getRecycleScoresFromDb(userId),
            getRecycleScoresFromApi(userId))
            .map<RecycleResponse> { RecycleResponse.OK(it) }
            .onErrorReturn { RecycleResponse.NotOK(it) }
}