2017-02-03 2 views
2

Ich habe Button in meiner App hinzufügen, um Benutzer Element zu einer Liste hinzufügen, wenn Benutzer auf die Schaltfläche Hinzufügen klicken ich nicht die Anfrage, um sofort zum Webservice zu gehen, möchte ich die Anfrage angesammelt werden und gesendet alle 1 Sekunden mit der Gesamtzahl der Klicks. Anstatt die Anfrage jedes Mal zu senden, wenn der Benutzer auf die Schaltfläche Hinzufügen klickt.Senden Sie angesammelte Anfragen an Webservice - RxJava2

Ich sah, dass es so etwas für RxSearchView implementiert ist. Ich überprüfte den Code es ist zu kompliziert

Ich benötige Hilfe mit, wo sollte ich mit solch einem Problem beginnen? oder irgendeine fertige Lösung dafür?

+0

(1req/s) pro Benutzer, Ich möchte nicht auf dem Server sein. – AnixPasBesoin

+0

@AnixPasBesoin Ich wollte die Anfragen alle 1 Sekunde senden, anstatt sie jedes Mal zu senden, wenn der Benutzer auf die Schaltfläche Hinzufügen klickt. Sorry für mein schlechtes Englisch :) – MBH

+0

Überprüfen Sie diese Frage http://stackoverflow.com/a/31768306/3503855 – AnixPasBesoin

Antwort

3

Sie suchen debounce Betreiber:

Gibt einen beobachtbaren, die die Quelle ObservableSource spiegelt, mit der Ausnahme, dass es Elemente von der Quelle ObservableSource emittierten Tropfen, die durch neuere Elemente gefolgt werden, bevor ein Timeout-Wert abläuft. Der Timer wird bei jeder Emission zurückgesetzt. wickeln enter image description here

einfach Ihre Click-Ereignisse in Observable:

Observable<Object> getButtonObservable(final Button button) { 
    return Observable.create(new ObservableOnSubscribe<Object>() { 
     @Override 
     public void subscribe(final ObservableEmitter<Object> e) throws Exception { 
      button.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        e.onNext(new Object()); //instead of Object you can use any data, e.g. derived from View tag 
       } 
      }); 
      e.setCancellable(new Cancellable() { 
       @Override 
       public void cancel() throws Exception { 
        button.setOnClickListener(null); 
       } 
      }); 
     } 
    }); 
} 

Und dann Anwendung, wenn Betreiber nicht in onDestroy (onDestroyView) austragen zu vergessen:

Button addButton; 
Disposable addButtonDisposable; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    ... 
    getButtonObservable(addButton) 
      .doOnSubscribe(new Consumer<Disposable>() { 
       @Override 
       public void accept(Disposable disposable) throws Exception { 
        addButtonDisposable = disposable; 
       } 
      }) 
      .debounce(1, TimeUnit.SECONDS) 
      ... //make request using flatMap or doOnNext, and subscribe 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    addButtonDisposable.dispose(); 
} 
+0

können Sie ein Codebeispiel für die Verwendung von es hinzufügen? – MBH

+0

Sicher, ich habe meine Antwort aktualisiert. –

+0

groß, danke sooo viel, eine letzte Frage, ist es möglich, eine benutzerdefinierte Ansicht mit dem OnClickListener auf die Entprellung Observable gesetzt zu machen? Vielen Dank im Voraus :) – MBH

Verwandte Themen