2016-10-20 7 views
0

サーバーからデータを取得してリストビューに表示するコードを書きました。 また、私はリフレッシュ機能にプルを追加します。 リフレッシュするときに追加のサブスクリプションを追加するかどうかは、ベストプラクティスなので、新しいサブスクリプションを追加する前に登録を解除する必要がありますか?リアクティブAndroidでリフレッシュするときにサブスクリプションを追加する

CompositeSubscription mSubscription = new CompositeSubscription(); 
private void pullToRefresh() { 
    Subscription subscription = mMatchingApi.getRequest(new GetRequest(
      new GetRequest.Builder().setRequestIds(orderIds))) 
      .subscribe(new Subscriber<GetRequestResponse>() { 
       //update list 
       } 
      }); 
    mSubscription.add(subscription); 
} 

私も明確なサブスクリプション私は時間(2または3時間)複数回の関数pullToRefresh()を呼び出した場合はonDestroy

@Override 
    public void onDestroy() { 
    if (mSubscription != null) { 
     mSubscription.clear(); 
    } 
    } 

でですから、例えば。 例:

だから、
result 1 = pullToRefresh(); 
result 2 = pullToRefresh(); 
result 3 = pullToRefresh(); 

結果1は次に、リストのデータが間違って表示される結果1.前、まだ完了し、2完全に結果ではありませんか? (結果1で表示されますが、結果2で表示されるはずです) 新しいものを追加する前にサブスクリプション1をクリアする必要がありますか?

答えて

1

生きているだけで、最新のリクエスト維持するために別々のSerialSubscriptionを使用する:あなたの最初の契約について

CompositeSubscription mSubscription = new CompositeSubscription(); 
SerialSubscription mPullRequest = new SerialSubscription(); 

{ 
    mSubscription.add(mPullRequest); // Stop all requests if mSubscription is unsubscribed 
} 

private void pullToRefresh() { 
    /* same code as before */ 
    mPullRequest.set(subscription); 
} 
+0

ありがとうございます。私はSerialSubscriptionで試してみる –

1

のデータがロードされ、onCompleteの()メソッドが呼び出されたときに、この契約は自動的に解除されます。

リフレッシュについては、どのように実装しているのか分かりませんが、Android RefreshLayoutなどは、以前のリフレッシュが終了していない限り、リフレッシュコールバックの呼び出しを無効にします。だから多分あなたはそれを行うことができます。

実際に複数の更新イベントが必要な場合は、新しい更新を作成する前に古い更新サブスクリプションの登録を解除することをお勧めします。

+0

ええ、私は、新しいものを作る前に古いリフレッシュしているサブスクリプションを解約できることを知っています。しかし、私はそれが別の方法、そのケースを処理するためのより良い方法を持つことができると思う。だから私は把握したい。 –

+0

より良い方法は、最初のものから2番目のリフレッシュ要求がどのように異なるのでしょうか?彼らはあなたのリフレッシュ要求が完了するのに全秒を要すると仮定しているからです。 – elmorabea

+0

ええ、私はそれについてあなたに同意しました。 –

関連する問題