Отправлять накопленные запросы в веб-сервис - RxJava2

У меня есть кнопка добавления в моем приложении, чтобы позволить пользователю добавлять элемент в список, если пользователь нажимает кнопку добавления, я не получаю запрос на немедленный переход к веб-сервису, я хочу, чтобы запрос накапливался и отправлялся каждые 1 секунды с общим количеством клики. вместо отправки запроса каждый раз, когда пользователь нажимает кнопку добавления.

Я видел, что что-то подобное реализовано для RxSearchView. Я проверил код, он слишком сложен

Мне нужна помощь, с чего мне начать с такой проблемой? или любое готовое решение для этого?


person MBH    schedule 03.02.2017    source источник
comment
(1треб/сек) на пользователя, я не хочу быть на месте вашего сервера.   -  person Anis LOUNIS    schedule 03.02.2017
comment
@AnixPasBesoin Я имел в виду отправлять запросы, накапливаемые каждую 1 секунду, вместо того, чтобы отправлять их каждый раз, когда пользователь нажимает кнопку добавления. Извините за мой плохой английский :)   -  person MBH    schedule 03.02.2017


Ответы (1)


Вы ищете debounce оператора:

Возвращает Observable, который отражает исходный ObservableSource, за исключением того, что он отбрасывает элементы, испускаемые исходным ObservableSource, за которыми следуют более новые элементы до истечения времени ожидания. Таймер сбрасывается при каждой эмиссии.введите здесь описание изображения

Просто оберните события кликов в 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);
                }
            });
        }
    });
}

И применить этот оператор, не забыв отписаться в onDestroy (onDestroyView):

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();
}
person Maksim Ostrovidov    schedule 03.02.2017
comment
отлично, большое спасибо, последний вопрос, возможно ли создать собственное представление с onClickListener, установленным для наблюдения за откатом? заранее спасибо :) - person MBH; 03.02.2017
comment
Вы можете обернуть любой обратный вызов в любой класс. Observable.create предназначен для таких случаев. - person Maksim Ostrovidov; 04.02.2017
comment
Кстати, я исправил свой ответ - e.setCancelable убрался из onClick обратного вызова. - person Maksim Ostrovidov; 04.02.2017