获取远程数据或通过rxJava 2获取本地数据

时间:2018-04-27 13:05:20

标签: android kotlin rx-java2

我有一个非常简单的任务来发送远程数据请求。但需要处理我的请求并获得本地远程错误。 像数学这样的功能方式有很多方法可以解决问题。

所以首先要简单地注意这样做:

val remote = remotePurchase
                .getAvailableUsersMaxCount()
                .subscribe({},{
                   //on failed            
                  getLocal()
        })

但我觉得它是rx初学者,也是回调糟糕的回调方式。

我也想这样做:

  override fun getActualUsersMaxCount(): Observable<Int> {
            return remotePurchase
                    .getAvailableUsersMaxCount()

                    .flatMap {
                        updateUsersCount(it)
                    }
                    .onErrorReturn {
                        userLocal.getById(PrefProvider.userId).map {
                            it.chatUsersCount?:0
                        }.blockingFirst()
                    }
        }

有些时候会把握:

  

引起:rx.exceptions.CompositeException:发生了2个异常。

喜欢这个github.com/ReactiveX/RxJava/issues/3679

然后我知道使用toBlocking并不是最好的主意。请参阅post here

过了一段时间后,我更好地决定了这个:

 override fun getActualUsersMaxCount(): Observable<Int> {

    val remote = remotePurchase
            .getAvailableUsersMaxCount()
            .flatMap {
                updateUsersCount(it)
            }.onErrorReturn { -1 }

    return zip(remote, userLocal.getById(PrefProvider.userId).map {
        it.chatUsersCount ?: 0
    }, { remoteCount, localCount ->

        if(remoteCount!= -1) remoteCount else localCount

    })
}

所以现在我差点控制局面。如果我从网络收到错误,我可以检查并收到本地结果

但你认为哪种变化更好?可能还有更简化的决定吗?

1 个答案:

答案 0 :(得分:1)

您可以使用onErrorResumeNext来避免第二个解决方案中的blockingFirst来电。在我看来,这使它成为更好的解决方案。你不是在确定两个例外。可以提供更多关于它们的背景,因为我没有看到这个问题。

override fun getActualUsersMaxCount(): Observable<Int> {
    return remotePurchase
        .getAvailableUsersMaxCount()
        .flatMap {
             updateUsersCount(it)
        }
        .onErrorResumeNext(
                 userLocal.getById(PrefProvider.userId).map {
                 it.chatUsersCount?:0
             })
}