この問題の解決策は、考えられるほど単純ではありません。私は異なるアプローチを実装しようとしました。 "クリアまたはリセット"の代わりに、私は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();
}
}
のは、マークの部分を説明してみましょう:毎回のユーザーがUIと対話する
BehaviorSubject
はUserInteraction
オブジェクト
- を受信し、放出する、あなたはメソッド
onInteraction()
を呼び出す必要がありますし、新しいアイテムを件名に「追加」されます。
- タイムアウトを設定します。指定された時間(
TIMEOUT_INTERVAL
)の放出アイテムがない場合、TimeoutException
がスローされます。タイマーは、subscribe()
をObservable
とし、getTimerExpiration()
メソッドで呼び出すと開始されます。
- 我々は例外
- を待っているので、我々は、我々は
のため申し訳ありません
を終えているので、私たちは、一つの値だけを放出したい
UserInteraction.FINISHED
オブジェクト