屏幕超时的可观察计时器 android
Observable Timer for screen timeout android
我正在处理一个用例,在该用例中,我必须在应用程序导航到主屏幕完成后实现某种屏幕超时。我希望它使用 Observable
来实现它,并使用 Observable.timer()
或 Observable.interval()
作为时间。 (两者都适合我的用例。)。每次用户与 activity 交互时,我都必须重置或刷新我的计时器 Observable
。
这就是我卡住的地方。我不知道如何刷新或重置 Observable
。一种简单的方法是在 onUserInteraction()
中每次处理前一个并创建一个新的,但我认为这不是一个好方法。有哪些替代方案?
这是一个完全有效的方法。处理/取消订阅现有的、过时的计时器,并使用现在正确的值启动一个新的可观察对象。如果您有太多的用户交互可能会导致性能不佳
另一种方法是使用类似易失性 expected-blank
的值,每次用户与应用程序交互时都会更新该值。您启动一个计时器,该计时器将在 expected-blank
时刻触发,并检查该值是否在未来。如果是,它会启动一个新的计时器实例并完成。如果它在 present/past 中,它会清空屏幕并完成。
解决这个问题并不像人们想象的那么简单。我尝试实施不同的方法。我使用 BehaviorSubject
而不是 "clear or reset" 可观察到的 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()
并且新项目是 "added" 到主题。
- 设置超时。当在指定的时间内 (
TIMEOUT_INTERVAL
) 没有发出任何项目时,它会抛出 TimeoutException
。当您在 getTimerExpiration()
方法提供的 Observable
上调用 subscribe()
时,计时器启动。
- 我们忽略所有发出的项目,因为我们正在等待异常
- 我们是 "transforming"
UserInteraction.FINISHED
对象的例外
- 我们只想发出一个值,因为我们正在完成
我正在处理一个用例,在该用例中,我必须在应用程序导航到主屏幕完成后实现某种屏幕超时。我希望它使用 Observable
来实现它,并使用 Observable.timer()
或 Observable.interval()
作为时间。 (两者都适合我的用例。)。每次用户与 activity 交互时,我都必须重置或刷新我的计时器 Observable
。
这就是我卡住的地方。我不知道如何刷新或重置 Observable
。一种简单的方法是在 onUserInteraction()
中每次处理前一个并创建一个新的,但我认为这不是一个好方法。有哪些替代方案?
这是一个完全有效的方法。处理/取消订阅现有的、过时的计时器,并使用现在正确的值启动一个新的可观察对象。如果您有太多的用户交互可能会导致性能不佳
另一种方法是使用类似易失性 expected-blank
的值,每次用户与应用程序交互时都会更新该值。您启动一个计时器,该计时器将在 expected-blank
时刻触发,并检查该值是否在未来。如果是,它会启动一个新的计时器实例并完成。如果它在 present/past 中,它会清空屏幕并完成。
解决这个问题并不像人们想象的那么简单。我尝试实施不同的方法。我使用 BehaviorSubject
而不是 "clear or reset" 可观察到的 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()
并且新项目是 "added" 到主题。 - 设置超时。当在指定的时间内 (
TIMEOUT_INTERVAL
) 没有发出任何项目时,它会抛出TimeoutException
。当您在getTimerExpiration()
方法提供的Observable
上调用subscribe()
时,计时器启动。 - 我们忽略所有发出的项目,因为我们正在等待异常
- 我们是 "transforming"
UserInteraction.FINISHED
对象的例外 - 我们只想发出一个值,因为我们正在完成