如何在另一个 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))
})))
我有两个不同类型的可观察对象,它们发出两种不同类型的对象。但是我需要在使用 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))
})))