用于屏幕超时android的可观察计时器

时间:2017-05-29 10:10:02

标签: android rx-java rx-android

希望你们都做得很好。我正在研究这个用例,我必须在完成哪个应用程序导航到主屏幕后实现一种屏幕超时。现在我希望它使用observable和计时器来实现它我知道我可以使用Obserable.timer()Observable.interval()。两者都非常适合这种用例。现在,每当用户与活动交互时,我都要重置或刷新我的计时器可观察对象。这是我被困的地方。我不知道如何刷新或重置一个observable。一个简单的方法是在onUserInteraction()中每次都处理前一个并设置一个新的,但我认为这不是一个好方法。

知道如何实现这个目标吗?

2 个答案:

答案 0 :(得分:3)

解决这个问题并不像人们想象的那么简单。我试过实现不同的方法。我使用BehaviorSubject 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(),并将新项目“添加”到主题。
  3. 设置超时。如果在指定的时间内没有发出项目(TimeoutException),它会抛出TIMEOUT_INTERVAL。当您通过subscribe()方法提供的Observable致电getTimerExpiration()时启动计时器。
  4. 我们忽略所有发出的项目,因为我们正在等待例外
  5. 我们正在“转换”UserInteraction.FINISHED对象
  6. 的例外情况
  7. 我们想要只发出一个值,因为我们正在完成

答案 1 :(得分:1)

这是一种非常有效的方法。处理/取消订阅现有的过时计时器,并使用现在正确的值启动一个新的observable。如果您有太多可能导致过度表现的用户互动

执行此操作的另一种方法是使用每次用户与应用程序交互时更新的易变expected-blank值。您启动一个计时器,该计时器将在expected-blank时刻触发,并检查该值是否在将来。如果是,则启动计时器的新实例并完成。如果它在当前/过去,它会使屏幕空白并完成。