gpt4 book ai didi

java - 什么时候不使用 RxJava 的 Observable?

转载 作者:太空狗 更新时间:2023-10-29 13:11:54 26 4
gpt4 key购买 nike

例如,我在我的应用程序中有一个简单的管理器,我试图让所有内容都 react :

class AppLockManager {

private val logger = LoggerFactory.getLogger(javaClass)

private val rxHelper: RxHelper
private val securityManager: DiarySecurityManager

private var locked = false
private var lastUnlockTime: LocalDateTime? = null

constructor(rxHelper: RxHelper, securityManager: DiarySecurityManager) {
this.rxHelper = rxHelper
this.securityManager = securityManager
}

fun shouldLock(): Observable<Boolean> {
return securityManager.isSecutiryEnabled()
.doOnNext { logger.debug("isSecurityEnabled: $it") }
.map { it && !locked && isLockTimerExpired() }
.doOnNext { logger.debug("shouldLock: $it") }
.compose(rxHelper.applySchedulers())
}

private fun isLockTimerExpired(): Boolean {
if(lastUnlockTime == null) return true
val timerExpiredMoment = lastUnlockTime!!.plusSeconds(30)
val now = LocalDateTime.now().isAfter(timerExpiredMoment)
val isExpired = LocalDateTime.now().isAfter(timerExpiredMoment)
logger.debug("timerExpiredMoment: $timerExpiredMoment / now: $now; isExpired: $isExpired")
return isExpired
}

fun setLocked(): Observable<Void> {
return Observable.create<Void> {
this.locked = true
it.onCompleted()
}.compose(rxHelper.applySchedulers())
}

fun setUnlocked(): Observable<Void> {
return Observable.create<Void> {
this.locked = false
lastUnlockTime = LocalDateTime.now()
}.compose(rxHelper.applySchedulers())
}

fun resetLockTimer(): Observable<Void> {
return Observable.create<Void> {
lastUnlockTime = LocalDateTime.now()
}.compose(rxHelper.applySchedulers())
}

}

这是一个简单的类,它计算时间并在我的应用程序必须锁定时从 shouldLock() 发出 true

我是这样用的:

fun lockAppIfNeeded() {
appLockManager.shouldLock()
.doOnNext { logger.debug("shouldLock: $it") }
.flatMap { if(it == true) Observable.just(it) else Observable.never() } // flow down only if it == true
.flatMap { appLockManager.setLocked() } // then lock
.subscribe(sub({}, Throwable::printStackTrace, { // use onComplete as source Observable is empty
securityManager.anyPassword().subscribe {
if (it) {
view.navigateToAskPassword() // anyPassword is true
} else {
view.navigateToFirstPasswordSetup() // anyPassword is false
}
}
}))
}

看起来很丑,不是吗? :)

我只是找不到合适的运算符来将空 Observable(appLockManager.setLocked()) 与 securityManager.anyPassword() 结合起来,从而返回发出一项的 Observable。

这让我相信我不应该将 RxJava 用于像 appLockManager.setLocked() 这样的方法。

我应该在这里使用 Observables 吗? 特别针对 setLocked()/setUnlocked()/resetLockTimer()仅更新 AppLockManager 并且根本不返回任何数据的方法。

最佳答案

使用嵌套订阅是不好的代码味道。要在另一个 Observable 完成后使用另一个,您可以concat Observables。

您的代码可以更简单。例如,而不是使用这个:

.flatMap { if(it == true) Observable.just(it) else Observable.never() } 

您可以改用过滤器

因此删除嵌套订阅 + filter 将导致此代码:

fun lockAppIfNeeded() {
appLockManager.shouldLock()
.doOnNext { logger.debug("shouldLock: $it") }
.filter { it } // flow down only if it == true
.flatMap { appLockManager.setLocked() } // then lock
.ignoreElements() // throw away appLockManager items
.concatWith(securityManager.anyPassword())
.subscribe {
if (it) {
view.navigateToAskPassword() // anyPassword is true
} else {
view.navigateToFirstPasswordSetup() // anyPassword is false
}
})
}

关于java - 什么时候不使用 RxJava 的 Observable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39564054/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com