android - 屏幕超时android的可观察计时器

标签 android rx-java rx-android

我正在处理一个用例,在该用例中,我必须在应用程序导航到主屏幕完成后实现某种屏幕超时。我希望它使用 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();
    }
}

让我们解释标记的部分:

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

关于android - 屏幕超时android的可观察计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44239862/

相关文章:

java - Retrofit 对象返回为 null

android - RXjava 中的转换类型

java - 是否可以找到存储中的图像然后显示它们?

android - Android Studio中的Gradle构建出错

android - 使用 RxJava 处理长时间运行的任务

rx-java - 使用 RxAndroid 进行智能轮询

Android写NFC代码导致 "unknown content"类型

java - 将屏幕分成 4 个相等的部分 - android

android - 我怎样才能同步订阅一个可观察对象,这样我就不会错过该可观察对象的发射?

java - 从 Observable 获取数组的值