2017-11-03 8 views
0

私は4つのタブを持つボトムバーを持っています。各タブはFragmentです。ユーザーが別のFragmentに移動したときにネットワークコールを停止したいので、ObservableコールをCompositeSubscriptionに追加し、onDestroyView()に登録を解除します。次回ユーザーが画面に入ると、すべてのネットワークコールが失敗します(私は退会しているので)ので、再度購読します。オブザーバブルに再登録する方法

私はこれをどうしたらよいか分かりません。どういうわけか、onResume()/onViewAttached()がフラグメントに対して呼び出されたときに再購読する必要があります。私は同様の質問をチェックして、その答えがcachereplay演算子を言及したが、私だけの間、私は、彼らはまた、以前に放出されたアイテムを取得するために求めていた原因それはケースだとは思わない:私はRxJava 1

Editを使用しています任意のネットワークコールを再度実行できるようにしたい。

これは私がネットワーク呼び出しのために観察可能に加入してる方法です:

  subscriptions.add(remoteDataSource.getFeedMore(localDataSource.getFirstStoredId()) 
       .doOnNext(new Action1<FeedItemsRequestDetailsWrapper>() { 
        @Override 
        public void call(FeedItemsRequestDetailsWrapper wrapper) { 
         if (wrapper != null) { 
          localDataSource.saveFeed(wrapper.getFeedItemList()); 
          localDataSource.saveServerState(wrapper.getFeedRequestDetails()); 
         } 
        } 
       }) 
       .subscribeOn(schedulerProvider.io()) 
       .observeOn(schedulerProvider.mainThread()) 
       .subscribe(new Action1<FeedItemsRequestDetailsWrapper>() { 
        @Override 
        public void call(FeedItemsRequestDetailsWrapper wrapper) { 
         // call to View to update 
        } 
       })); 

そして、どのように私は退会:

@Override 
public void unsubscribe() { 
    if (subscriptions != null && subscriptions.hasSubscriptions()) { 
     subscriptions.unsubscribe(); 
    } 
} 

例ユースケース:ユーザーは、ユーザーがAクリック、Timeline画面に入り、ボタンを押すと、ネットワークコールが実行されます(前述のコードのようにPresenterクラスにObservableとしてモデル化されています)。その後、ユーザーはこの画面を終了します( onDestroyView()が呼び出され、サブスクリプションは登録解除されます)。しばらくしてから、ユーザはTimeline画面を再度入力し、ボタンをクリックします。

これは私がHTTP FAILED: java.io.IOException: Canceledを受け取ったときに私が購読を停止したために再購読したいので、エラーなしでネットワークコールを実行できます。

おかげ

+0

'CompositeSubscription'が退会するために' clear'を呼び出しますか?はいの場合は、さらに表示する必要があります。 – masp

+0

私はいくつかのコードで質問を更新しました。 – Mes

答えて

1

更新

あなたはCompositeSubscritionで配信停止を呼び出す場合、あなたは再びそれに新しいサブスクリプションを追加することはできません。同じコンポジット・インスタンスを再度使用する場合は、subscriptions.clear()をコールするか、フラグメントが初期化されたときに新しいインスタンスを作成する必要があります。

まず第一に、物事、あなたがなど観察可能/ストリーム/フロアブルから退会場合はつもり着信データ/イベントを失います。

サブスクリプションの最新の結果を取得する場合は、サブスクリプションが発生する前にそれを行う必要があります。

サブスクリプションは、完全に終了/破棄されない限り、FragmentまたはActivityライフサイクルに依存しないようにしてください。

長いリクエストがあることがわかっている場合は、android.app.Serviceに登録する必要があります。

次に、ServicesFragments/Activitiesの間を行き来する別の問題に直面します。

場合によっては、BehaviourSubjectをシングルトンクラスに作成することができます(Daggerを使用して、フラグメントとサービスの両方にmodelを注入する方がよい)。次にあなたのServiceあなたの長期間のストリームを購読し、その次のイベントを公開するBehaviourSubject

BehaviourSubjectは、最後に放出されたデータを保存します。次回に新しく作成されたフラグメントにそれらをサブスクライブすると、最後に放出されたアイテムから開始されます。

もちろん、この回答はあなたの必要に応じて1つのユースケースをカバーするだけで、何か他のことをする必要があるかもしれません。

+0

しかし、私は実際に最後に放出されたデータを気にしません。私はちょうど観測可能な(再び)購読したい。 – Mes

+0

@Mes subscriptions.clear()ではなく、.unsubscribe()を呼び出す必要があります。 – Gunhan

関連する問題