如何在另一个可观察的订阅函数-RxJava

时间:2019-05-28 06:27:24

标签: android kotlin observable rx-java reactive-programming

我有两个不同类型的可观察对象,它们发出两种不同类型的对象。但是我需要使用userId和role成功登录后更新分析。成功登录后,已经在viewModel登录函数调用中设置了用户ID。

                       viewModel.login(emailId)
                                .observeOn(AndroidSchedulers.mainThread())
                                .autoDisposable(scopeProvider)
                                .subscribe({ (role, images) ->
                                analyticsProvider.updateUser(mapOf(Constants.Role to role, 
Constants.userId to *NEED TO ENTER USER ID FROM OTHER OBSERVABLE HERE*)))

我的Session Observable发出用户对象。

 class SessionClass{
        private val user = BehaviorSubject.create<User>()
        override fun setUser(user: User) {
                this.user.onNext(user)
            }
         override fun getUser(): Observable<User> = user.hide()
    }

我试图在那个地方打电话给SessionClass().getUser().blockingFirst().userId,但电话挂在登录屏幕上。

有什么办法可以解决此问题?

1 个答案:

答案 0 :(得分:0)

您的解决方案不能仅仅因为您立即实例化一个SessionClass而从不调用setUser(),所以getUser().blockingFirst()将永远阻塞。我将假设您有一个SessionClass实例,该实例实际上在某个时刻会调用setUser()

访问用户的关键是combine Observables。在这种情况下,适当的选择是zipWith运算符。这将允许您一次对两个来源的值进行运算。例如,您的代码可能看起来像这样:

val session: SessionClass = TODO() // get an instance somewhere

viewModel.login(emailId)
    .observeOn(AndroidSchedulers.mainThread())
    .zipWith(session.getUser().firstOrError(), BiFunction { (role, images): Pair<Role, Images>, user: User -> Triple(role, images, user) })
    .autoDisposable(scopeProvider)
    .subscribe({ (role, images, user) ->
        analyticsProvider.updateUser(mapOf(Constants.Role to role, Constants.userId to user.userId))
    })))