2015-12-12 5 views
16

私はまだRxJavaを考え出していて、Retrofit 2でネットワーキングのものをやっています。これを試してみましたが、今のところコードは読みやすくなりましたが、私は傾けることができないような問題がある。アクティビティリストア後にRxJavaがイベントに再サブスクライブする

私はログインを実行しようとしています(APIトークンを返します)。このトークンを使用して、チェーンの出力がトークン+データになるように、同じチェーン内のすべての初期データを取得します。

apiClient 
    .login() 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .flatMap(token -> getData(token)) 
    .subscribe(new Subscrber<Bundle>() {...}); 

と私は私のAPIサービス呼び出してこれを行うにはこれは罰金見えたが、私はまた、チェーンを起動および停止時にプログレスバーを表示したかったです。そこで.doOnSubscribe().doOnUnsubscribe()を追加しました。しかし、オリエンテーションを変更した後で、プログレスバーを非表示にしようとしていたフラグメントが常にnullであることに気付きました。

RxLifecycle libを検索して見つけたので、助けてくれるようでした。今は.cache()とイベントチェーンの登録を解除しています。しかし、その後同じイベントに再びonCreate()で購読する方法はわかりません。私はかなり基本的なものを見逃していると思うし、これについての助けを感謝します。

+1

私はあなたのロジックを分割し、 'MVP'パターンを実装することができます。その後、 'Presenter'クラス(理想的にはビューインスタンスごとにシングルトンでなければなりません)は、すべてのネットワーキングを処理し、スクリーンローテーション後にビューを再構築します。実際には、rxJava https://github.com/konmik/nucleusに基づく 'MVP'パターンを使用することができるきれいなライブラリがあります(これは本当に小さいです)。たとえあなたがそれを使いたくないとしても、それをどのように実装できるかを知ることができます – Than

+0

hmm .. okだから、RxJavaのルートを下る前に、良いMVP実装を読み出す必要があると思います... –

+1

'MVP'は、あなたのコードをもっときれいにすることができますし、この問題を解決しますが、それはあなたが探している解決策ではないかもしれません(アプリケーションアーキテクチャ全体をMVPに切り替えるのは簡単ではありません)。回答)。サードパーティ製のlibやいくつかの素敵なパターンを使って 'MVP'なしでやる方法があると確信していますが、クリーンな解決策はありませんでした。上記のコメントを「他の人がどのように類似の問題を処理しているか」と考えてください。 – Than

答えて

0

あなたは.cache()から返され同じ観察可能インスタンスに加入していることを確認する必要があります。通常、このインスタンスはSingleton(Applicationクラスのような)、保持されたフラグメント、またはAndroidサービスのどこかに格納します。

+0

cache()もエラーをキャッシュするので、注意してください! – scana

1

これを達成するために必ずしもアーキテクチャパターンを使用する必要はありません。すべてのMVP/MVCは分離、テストなどの面で優れたものですが、Controller/Presenter/DAOをアプリケーション全体のシングルトンにすることは、アプリケーション全体の人生を通してメモリを保持するということはお勧めできません。ここで

は保持フラグメントインスタンスとRxJavaを使用して、サンプルプロジェクトだ - 姿勢変化に破壊されてからそれを保護する、と呼ばれるsetRetainInstance(真)でフラグメントを使用して、あなたを保存することがありhttps://github.com/krpiotrek/RetainFragmentSample

主なアイデアそこで観察可能です。ここでは、アクティビティ/フラグメントのonCreateで

protected void onCreate(Bundle savedInstanceState) { 
    if (savedInstanceState == null) { 
     // first run, create observable 
     mInfoObservable = createInfoObservable(); 
     // set Observable in retained fragment 
     RetainFragmentHelper.setObject(this, getSupportFragmentManager(), mInfoObservable); 
    } else { 
     // following runs, get observable from retained fragment 
     mInfoObservable = RetainFragmentHelper.getObjectOrNull(this, getSupportFragmentManager()); 
    } 

    // subscribe 
    mInfoObservable.subscribe(...); 
} 

ことをどのように処理するかだ)一つの方法は、(使用キャッシュにある、あなたの観察可能に最後の値をキャッシュしている心の中でオペレーターをしてください。