屏幕超时的可观察计时器 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" 可观察到的 ObserverObservable.

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();
    }
}

让我们解释一下标记的部分:

  1. BehaviorSubject 接收并发出 UserInteraction 个对象
  2. 每次用户与 UI 交互时,您应该调用方法 onInteraction() 并且新项目是 "added" 到主题。
  3. 设置超时。当在指定的时间内 (TIMEOUT_INTERVAL) 没有发出任何项目时,它会抛出 TimeoutException。当您在 getTimerExpiration() 方法提供的 Observable 上调用 subscribe() 时,计时器启动。
  4. 我们忽略所有发出的项目,因为我们正在等待异常
  5. 我们是 "transforming" UserInteraction.FINISHED 对象的例外
  6. 我们只想发出一个值,因为我们正在完成