希望你们都做得很好。我正在研究这个用例,我必须在完成哪个应用程序导航到主屏幕后实现一种屏幕超时。现在我希望它使用observable和计时器来实现它我知道我可以使用Obserable.timer()
或Observable.interval()
。两者都非常适合这种用例。现在,每当用户与活动交互时,我都要重置或刷新我的计时器可观察对象。这是我被困的地方。我不知道如何刷新或重置一个observable。一个简单的方法是在onUserInteraction()
中每次都处理前一个并设置一个新的,但我认为这不是一个好方法。
知道如何实现这个目标吗?
答案 0 :(得分:3)
解决这个问题并不像人们想象的那么简单。我试过实现不同的方法。我使用BehaviorSubject
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
个对象onInteraction()
,并将新项目“添加”到主题。 TimeoutException
),它会抛出TIMEOUT_INTERVAL
。当您通过subscribe()
方法提供的Observable
致电getTimerExpiration()
时启动计时器。UserInteraction.FINISHED
对象答案 1 :(得分:1)
这是一种非常有效的方法。处理/取消订阅现有的过时计时器,并使用现在正确的值启动一个新的observable。如果您有太多可能导致过度表现的用户互动
执行此操作的另一种方法是使用每次用户与应用程序交互时更新的易变expected-blank
值。您启动一个计时器,该计时器将在expected-blank
时刻触发,并检查该值是否在将来。如果是,则启动计时器的新实例并完成。如果它在当前/过去,它会使屏幕空白并完成。