我正在处理一个用例,在该用例中,我必须在应用程序导航到主屏幕完成后实现某种屏幕超时。我希望它使用 Observable
实现它,并使用 Observable.timer()
或 Observable.interval()
进行计时。 (两者都适合我的用例。)。每次用户与 Activity 交互时,我都必须重置或刷新我的计时器 Observable
。
这就是我卡住的地方。我不知道如何刷新或重置 Observable
。一种简单的方法是每次在 onUserInteraction()
中处理前一个并创建一个新的,但我认为这不是一个好的方法。有哪些替代方案?
最佳答案
解决这个问题并不像人们想象的那么简单。我尝试实现不同的方法。我使用 BehaviorSubject
而不是“清除或重置”observable,它既是 Observer
又是 Observable
。
public class RxTimerNavigation {
private final long TIMEOUT_INTERVAL = 4;
private final BehaviorSubject<UserInteraction> userInteractionsSubject = BehaviorSubject.create(UserInteraction.IGNORED); // (1)
public void onInteraction() {
userInteractionsSubject.onNext(UserInteraction.IGNORED); // (2)
}
public Observable<UserInteraction> getTimerExpiration() {
return userInteractionsSubject
.timeout(TIMEOUT_INTERVAL, TimeUnit.SECONDS) // (3)
.filter(__ -> false) // (4)
.onErrorReturn(__ -> UserInteraction.FINISHED) // (5)
.first() // (6)
.subscribeOn(AndroidSchedulers.mainThread())
.observeOn(AndroidSchedulers.mainThread())
.asObservable();
}
static class UserInteraction {
static final UserInteraction IGNORED = new UserInteraction();
static final UserInteraction FINISHED = new UserInteraction();
}
}
让我们解释标记的部分:
BehaviorSubject
接收并发出UserInteraction
对象- 每次用户与 UI 交互时,您都应该调用方法
onInteraction()
并将新项目“添加”到 Subject。 - 设置超时。当在指定的时间量 (
TIMEOUT_INTERVAL
) 内没有发出项目时,它会抛出TimeoutException
。当您在getTimerExpiration()
方法提供的Observable
上调用subscribe()
时,计时器启动。 - 我们忽略所有发出的项目,因为我们正在等待异常
- 我们正在将异常“转换”为
UserInteraction.FINISHED
对象 - 我们只想发出一个值,因为我们正在完成
关于android - 屏幕超时android的可观察计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44239862/