2017-05-29 13 views
0

あなたは皆がうまくやっていることを願っています。私は、アプリケーションがメイン画面にナビゲートした後に一種の画面タイムアウトを実装する必要があるこのユースケースに取り組んでいます。今私はそれがobservableを使用してそれをしたいと私はObserable.timer()またはObservable.interval()を使用することができますタイマーのために知っている。両方とも、この種のユースケースには完璧です。ユーザーがアクティビティとやりとりするたびに、私はタイマーをリセットまたはリセットする必要があります。これが私がぎこちないところです。私は観測値をリフレッシュまたはリセットする方法を知らない。簡単な方法は、以前のものを廃棄し、毎回onUserInteraction()に新しいものを設定することですが、私はその良いアプローチだとは思いません。画面タイムアウトのための観察可能なタイマーandroid

どのようにこれを達成するためのアイデアですか?

答えて

1

これは完全に有効なアプローチです。既存の旧式のタイマーを廃棄/登録解除し、現在の正しい値で新しい観測値を開始します。過度のパフォーマンスを引き起こす可能性のあるユーザーの操作が多すぎる場合

これを行うもう1つの方法は、ユーザーがアプリケーションとやりとりするたびに更新される揮発性のexpected-blankの値を持つことです。あなたは、その時点でexpected-blankのトリガーとなるタイマーを開始し、その値が将来のものかどうかをチェックします。そうであれば、それはタイマーの新しいインスタンスを開始し、完了する。現在/過去の場合は、画面を空白にして完了します。

2

この問題の解決策は、考えられるほど単純ではありません。私は異なるアプローチを実装しようとしました。 "クリアまたはリセット"の代わりに、私は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(); 
    } 
} 

のは、マークの部分を説明してみましょう:毎回のユーザーがUIと対話する

  1. BehaviorSubjectUserInteractionオブジェクト
  2. を受信し、放出する、あなたはメソッドonInteraction()を呼び出す必要がありますし、新しいアイテムを件名に「追加」されます。
  3. タイムアウトを設定します。指定された時間(TIMEOUT_INTERVAL)の放出アイテムがない場合、TimeoutExceptionがスローされます。タイマーは、subscribe()Observableとし、getTimerExpiration()メソッドで呼び出すと開始されます。
  4. 我々は例外
  5. を待っているので、我々は、我々は
  6. のため申し訳ありません
+0

を終えているので、私たちは、一つの値だけを放出したいUserInteraction.FINISHEDオブジェクト

  • に例外を「転換」されている、すべての放射されたアイテムを無視遅い応答。私は間違いなくこれを試し、これが私のために働くかどうかをあなたに知らせます。とにかく、そのような詳細な、簡潔な答えのおかげで:) –