【发布时间】:2016-09-19 01:02:06
【问题描述】:
例如,我的应用程序中有一个简单的管理器,我试图在其中保留所有内容reactive:
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() wwitch return Observable 结合起来,它会发出一个项目。
这让我相信我不应该将 RxJava 用于像 appLockManager.setLocked() 这样的方法。
我应该在这里使用 Observables 吗? 专门用于 setLocked()/setUnlocked()/resetLockTimer() 方法,它只更新 AppLockManager 并且根本不返回任何数据。
【问题讨论】:
标签: java android rx-java kotlin rx-android