2017-09-07 3 views
0

Ich habe eine Recycler-Ansicht mit Artikeln darin. Wenn ich auf ein Element klicke, um einen API-Aufruf zu machen, um Daten in einer anderen Recycler-Ansicht anzuhängen, ist das Problem, wenn der Benutzer mehrfach auf Elemente im Recycler klickt, viele API-Anfragen macht und die letzten zurücksendet die letzte geklickten Artikel Anfrage, und ich will den Rest der Anfragen löschen und ignorieren sie mich versuche ti einen Timer verwenden, aber es istNachrüstung bekomme die letzte Anfrage von mehreren Anfragen

es ausgefallen ist mein aktueller Code

@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(); 

    } 

aber diese Lösung does't Arbeit eigentlich so, wenn jemand eine Lösung hat oder RxJava dafür benutzt.

+0

Verwenden Sie die Call-Klasse von Retrofit 2, um Ihre Netzwerkanforderung zu erstellen, mit der Sie sie auch abbrechen können. Verwenden Sie eine Datenstruktur (wie Stack), um die Liste der hinzugefügten Aufrufobjekte beizubehalten und sie jedes Mal zu überprüfen, wenn auf das Listenelement geklickt wird und eine neue Anforderung erstellt werden muss. So stornieren Sie die Anfrage - https://futurestud.io/tutorials/retrofit-2-cancel-requests Es kann Rx Weg auch sein, aber nicht darüber jetzt wissen – Napolean

Antwort

1

Ich suchte nach etwas Ähnlichem. Hier ist, wie ich erreicht dies mit Retrofit + RxJava

CompositeSubscription erstellen

private CompositeSubscription mSearchPlaceSubscription = new CompositeSubscription(); 

Nun, bevor Sie API aufrufen & neue API-Aufruf Anmeldung, muss ich

mSearchPlaceSubscription.clear(); 

Dieser Schritt führt in abzubestellen vorherige Anfragen & daher RxJavaCallAdapter wird okhttp Client bitten, die Anfrage abzubrechen.

& dann nenne ich API auf diese Weise:

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); 
        } 
       })); 

hier

mSearchPlacesHelper.searchPlaces(query) die Observable kehrt auf die ich subscribe (was gibt Subscription). Ich mache all diesen Code innerhalb
mSearchPlaceSubscription.add(), die Abonnement-Objekt akzeptiert.

so mein letzter API-Aufruf wie folgt aussieht:

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) { 

        } 
       })); 

Hope this :)

+0

ich Live-Daten-Fabrik verwenden, um ein Live zurückzukehren Datenobjekt anstelle von Anruf, so kann ich kein obseravble von ihm zurückgeben –

+0

Sorry, aber ich habe nicht Live-Datenobjekt bekommen. Meinst du LiveData von Architekturkomponenten? –

+0

Ja Ich benutze eine benutzerdefinierte Fabrik, um ein LiveData-Objekt anstelle von Call-Objekt –

0

hilft Sie es durch Abbrechen aller anstehenden Anforderungen tun, wenn ein neuer Antrag gestellt wird. Wenn Sie beispielsweise zwei Objekte gedrückt haben, brechen Sie bei der zweiten Anfrage alle ausstehenden Anfragen mit diesem Code ab.

client.dispatcher().cancelAll()

Hoffnung, dies hilft Ihnen.

Verwandte Themen