如何在另一个 Observable 订阅函数中使用 Object Observable 的变量 - RxJava

How to use an variable of Object Observable inside another Observable subscribe function - RxJava

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

                       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 发出 User 对象。

 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,但 phone 在登录屏幕上挂起。

有什么办法可以解决这个问题吗?

您的解决方案不起作用仅仅是因为您立即实例化了一个 SessionClass 而从不调用 setUser(),因此 getUser().blockingFirst() 将永远阻塞。我假设你有一个 SessionClass 的实例,它实际上会在某个时候调用 setUser()

访问用户的关键是 combine the Observables. The appropriate choice in this situation is the 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))
    })))