2017-09-07 9 views
0

アイテムを含むリサイクルビューがあります。私がアイテムをクリックすると、別のリサイクラビューでアタッチするためにいくつかのデータを取得するためのAPIコールが発生します。リサイクラのアイテムで複数回クリックすると、多くのAPIリクエストが返され、最後にクリックされた項目の要求と私は要求の残りをキャンセルし、私はtiは、タイマーを使用してみてくださいそれらを無視したいが、それはそこに私の現在のコード複数のリクエストの最後のリクエストを取得する

@Override 
    public void onSelectedSourceClick(SelectedSource selectedSource, int position) { 
     newsAdapter.clearNewsList(); 

     okHttpClient.dispatcher().cancelAll(); 

     if (countDownTimer != null) { 
      countDownTimer.cancel(); 
     } 
     countDownTimer = new CountDownTimer(500, 1000) { 
      @Override 
      public void onTick(long l) { 

      } 

      @Override 
      public void onFinish() { 
//Make the request here 
       } 
      } 
     }.start(); 

    } 

がある。しかし、このソリューションが作業をdoes't

を失敗しています実際には、いずれかが解決策を持っている場合、またはRxJavaを使用している場合です。

+0

Retrofit 2のCallクラスを使用してネットワーク要求を形成し、これもキャンセルできます。追加された呼び出しオブジェクトのリストを保持するためのデータ構造(Stackなど)を使用し、リストアイテムがクリックされ、新しい要求を作成する必要があるたびにチェックします。 リクエストをキャンセルする方法 - https://futurestud.io/tutorials/retrofit-2-cancel-requests Rx方法もありますが、現在は知らない – Napolean

答えて

1

私は似たようなものを探していました。ここで私はレトロフィット+ RxJava

を使用して、これは新しいAPI呼び出しの購読API &を呼び出す前に、今、あなた

private CompositeSubscription mSearchPlaceSubscription = new CompositeSubscription(); 

CompositeSubscriptionを作成達成方法です、私はそのステップから退会になります

mSearchPlaceSubscription.clear(); 

行います以前のリクエスト&したがって、RxJavaCallAdapterは、リクエストをキャンセルするようにokhttpクライアントに依頼します。

&、私はこの方法でAPIを呼び出す:

mSearchPlaceSubscription.add(mSearchPlacesHelper.searchPlaces(query) 
       .subscribeOn(Schedulers.newThread()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(new Subscriber<List<Prediction>>() { 
        @Override 
        public void onCompleted() { 

        } 

        @Override 
        public void onError(Throwable e) { 

        } 

        @Override 
        public void onNext(List<Prediction> predictions) { 
         setChanged(); 
         notifyObservers(predictions); 
        } 
       })); 

ここ

mSearchPlacesHelper.searchPlaces(query)は(Subscriptionを返す)I subscribeこれにObservableを返します。私はこのコードをすべて
mSearchPlaceSubscription.add()サブスクリプションオブジェクトを受け付ける内部で行います。

ので、私の最後のAPIの呼び出しは次のようになります。

mSearchPlaceSubscription.clear(); 
mSearchPlaceSubscription.add(mSearchPlacesHelper.searchPlaces(query) 
       .subscribeOn(Schedulers.newThread()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(new Subscriber<List<Prediction>>() { 
        @Override 
        public void onCompleted() { 

        } 

        @Override 
        public void onError(Throwable e) { 

        } 

        @Override 
        public void onNext(List<Prediction> predictions) { 

        } 
       })); 

・ホープこのことができます:)

+0

ライブデータファクトリを使用してライブを返す私はそれからobseravbleを返すことはできませんので、データオブジェクトを呼び出す –

+0

申し訳ありませんが、私はライブデータオブジェクトで取得していません。あなたはArchitecture ComponentsからのLiveDataを意味しますか? –

+0

はい私はカスタムオブジェクトを使用して呼び出しオブジェクトの代わりにLiveDataオブジェクトを取得します –

0

をあなたは新しい要求が行われたときに、すべての保留中の要求をキャンセルすることによってそれを行うことができます。 2つのアイテムを押してから2回目のリクエストをした場合は、このコードを使用してすべての保留中のリクエストをキャンセルします。

client.dispatcher().cancelAll()

が、これはあなたのお役に立てば幸いです。

関連する問題