2017-01-18 9 views
0

AndroidプロジェクトでRxJavaを使用していて、何かを正しく実装していることを確認します。RxJavaを使用してコンフィグレーションの変更中に一時的に変数を保存する

Observableを使用してサーバーにログインしています。ログインが行われた後、私はdoOnNext()演算子を使ってこれを行うために、クライアント側にユーザ​​名を保存することができます。デバイスは、私が依頼する必要がないように走っていた観測可能に再サブスクライブすることができるようにしたいのログインが終了する前に設定の変更を通過する場合

Observable<Response<Void>> doLogin(Observable<Response<Void>> retainedObservable, Subscriber subscriber, String username, String password, boolean saveUsername)  { 
if (retainedObservable == null) { 
    retainedObservable = networkLayer.loginWithcredentials(username, password) 
    .doOnNext(new Action1<Response<Void>>() { 
     @Override 
     public void call(Response<Void> voidResponse) { 
      if (saveUsername) { 
       databaseLayer.saveUsername(username).subscribe(); 
      } else { 
       databaseLayer.saveUsername(null).subscribe(); 
      } 
     } 
    }) 
    .cache(); 
} 

    mSubscription = retainedObservable.subscribeOn().observeOn().subscribe(subscriber); 
    return retainedObservable; 
} 

:ここでは、これがどのように見えるかの例を示します。ログインボタンを再度押すというユーザの資格情報を再入力する。

これを達成するために、最初にdoLogin(...)を呼び出して、返された観測値をデータホルダクラスに一時的に保存します。デバイスが設定変更を行った場合、私は既に作成されたobservableをデータ保持者クラスから取得し、それを再登録することができます。これは素晴らしい、私の唯一のハングアップ私は一時的にユーザー名、パスワードとsaveUsernameフラグをオフに保存する必要があることです。これは十分に簡単ですが、RxJavaをObservableで保持してdoOnNext(...)で必要なときにそれらにアクセスできる方法があるのだろうかと思います。 doOnNext(...)が実行されたときにObservableに再登録すれば、私はsaveUsernameフラグや明らかに悪いユーザー名の値を持たないでしょう。

Observableを保持するだけでいいのですが、どうにかしてusername、password、saveUsernameフラグを保持しておくといいでしょう。 RxJavaでこれを達成する方法はありますか、あるいは私が設定変更の間にそれらの変数を保持したい場合、私は現在それを実行する必要がある方法です。

+1

retainObservableとcachedObservableは同じものとしますか?現在、retainObservableは実際には何のためにも使用されていません。 –

+0

良いキャッチです。私はそれを転送する間違いをした。今修正されました。 – neonDion

答えて

1

本質的には、はい。 RxJavaは機能的なステートレスAPIを使用しているため、返される値とは別にオブザーバブルに追加のデータを追加することは実際にはできません(または想定されています)。

  • あなたは追加の値をキャプチャすることができますいずれかの閉鎖で、あなたは今それをやっているか に類似:

    は、関数型言語と同じように、一般的に、あなたはこれについて行くことができる2つの方法があります。しかし、明らかにそれらの値は上記クロージャーの範囲内でしかアクセスできないので、 メソッドから観察可能であり、後で に使用された変数にアクセスすることはできません。

  • 後でそのデータにアクセスする必要がある場合、通常の方法は、すべてのデータを含む何らかの結果オブジェクトを作成することです。例えば、あなたの応答と元のログインデータを含む "LoginResult"クラスです。
関連する問題