我是RxJava的新手,在尝试了几天可以在网上找到的所有内容之后,我发现我确实需要这一方面的帮助。
我从本地和远程资源中获取我的存储库中的成员。我添加了一些运算符来优先(通过反跳)返回我的远程源,并过滤掉错误,因此如果其中一个远程不可用或数据库为空,它将仅返回2个中的1个。]
只要我的两个来源之一返回某东西,它就可以正常工作,但是如果两个来源都返回错误,就会出现问题:当我滤除错误时,它不会返回任何东西,并且永远不会调用我的订阅。] >
也许有一个简单的解决方案,但到目前为止我还没有找到,有人可以帮忙吗?
这是我的存储库中的fetchMember():
override fun fetchMember(): Observable<MemberModel?> { return Observable.concatArrayDelayError(memberLocalSource.fetchMember(), memberRemoteSource.fetchMember()) .doOnNext { member -> saveMember(member!!) } .materialize() .filter { !it.isOnError } .dematerialize { it -> it } .debounce(400, TimeUnit.MILLISECONDS) }
这是我的视图模型:
fun fetchToken(username: String, password: String) { val loginDisposable = authApiService.loginWithJWT(username, password) .flatMap { isAuthenticated = isTokenValid(username, password, it) sharedPreferences.setHasValidCredentials(isAuthenticated) memberRepository.fetchMember() } .subscribeOn(Schedulers.io()) .observeOn((AndroidSchedulers.mainThread())) .doOnError { throwable -> throwable.printStackTrace() } .subscribe( { member -> memberLiveData.value = member this.memberId = member!!.id.toString() this.memberName = member.name.split(" ")[0] if(isAuthenticated) { authenticationState.value = AuthenticationState.AUTHENTICATED_VALID_MEMBER } else { authenticationState.value = AuthenticationState.UNAUTHENTICATED_VALID_MEMBER } }, { error -> if(isAuthenticated) { authenticationState.value = AuthenticationState.AUTHENTICATED_INVALID_MEMBER } else { authenticationState.value = AuthenticationState.INVALID_AUTHENTICATION } }) disposable.add(loginDisposable) } private fun isTokenValid(username: String, password: String, authResponse: AuthModel): Boolean { return if (authResponse.data != null) { false } else { tokenInterceptor.token = authResponse.token val tokenWithCredentials = AuthModel(authResponse.token, null, null, username, password) tokenRepository.saveToken(tokenWithCredentials) true } }
我是RxJava的新手,经过几天的尝试,我可以在网上找到所有东西,我发现我确实需要这一方面的帮助。我从本地和远程源中获取资源库中的成员。我添加了...
最后我设法通过添加使其起作用:
.defaultIfEmpty(MemberModel(-1))