【发布时间】:2019-01-16 16:05:18
【问题描述】:
我想获得您对以下代码的反馈。
我想知道拨打currentSession.onNext(result.session) 是否安全
从SessionManager.signIn 流内部。
由于多线程和同步问题,我的第一直觉是说NO,这意味着,根据这段代码,我可以从不同的线程调用currentSession.onNext(result.session)。
这里是代码,请告诉我你的想法!谢谢
SessionManager 是一个单例
@Singleton
class SessionManager @Inject constructor(
private val sessionService: SessionService,
){
val currentSession = BehaviorProcessor.create<Session>()
fun signIn(login: String, password: String): Single<Boolean> =
sessionService.signIn(login, password)
.doOnNext(result ->
if (session is Success) {
currentSession.onNext(result.session)
}
).map { result ->
when (result) {
is Success -> true
else -> false
}
}
.subscribeOn(Schedulers.io())
}
HomeView 是订阅 SessionManager 的登录流的随机视图
class HomeView(val context: Context) : View(context) {
@Inject
lateinit var sessionManager: SessionManager
private val disposables = CompositeDisposable()
override fun onAttachedToWindow() {
super.onAttachedToWindow()
disposables.add(sessionManager.signIn("username", "password")
.distinctUntilChanged()
.observeOn(AndroidSchedulers.mainThread())
.subscribe { result ->
textView.text = if (result) "Success" else "Fail"
})
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
disposables.clear()
}
}
从SessionManager观察currentSession的随机视图
class RandomView(val context: Context) : View(context) {
@Inject
lateinit var sessionManager: SessionManager
private val disposables = CompositeDisposable()
override fun onAttachedToWindow() {
super.onAttachedToWindow()
disposables.add(sessionManager.currentSession
.distinctUntilChanged()
.observeOn(AndroidSchedulers.mainThread())
.subscribe { session -> userTextView.text = session.userName })
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
disposables.clear()
}
}
【问题讨论】:
标签: multithreading kotlin rx-java2 observer-pattern