Как реализовать автозаполнение с помощью RxBinding, RxJava и Retrofit - PullRequest
0 голосов
/ 14 февраля 2019

Я новичок в RxJava, и есть много примеров и ответов, но у меня возникают проблемы с соединением чего-то, что решает все мои проблемы.

Код ниже, кажется,за исключением того, что я иногда получаю результаты не в порядке.Поэтому я думаю, что мне нужно ввести switchMap, но я точно не знаю, где именно, и мне интересно, если я еще не сделал ненужные сложности, например, странно ли подписываться на RxBinding и отдельно подписываться на сетевой вызов?

view.autocompleteText () является RxBinding.Я хочу получить от этого текст, позвонить в сервис модернизации и обновить представление с результатами, со всеми наворотами, такими как показ / скрытие счетчика, и обработкой ошибок для сетевого вызова, которая не убьет все это и не сделает мойтекстовое поле не отвечает.

private void handleAutocompleteText() {
    mCompositeDisposable.add(view.autocompleteText()
        .debounce(400, TimeUnit.MILLISECONDS)
        .filter(s -> s.length() >= resources.getAutocompleteThreshold())
        .observeOn(threads.main())
        .doOnNext(s -> view.setProgressVisible(true))
        .subscribe(s -> {
            mCompositeDisposable.add(mAutocompleteService.query(s.toString())
                .subscribeOn(threads.io())
                .observeOn(threads.main()).toObservable()
                .retry(3)
                .doOnNext(response -> {
                    if (response.getStatus() != 200)
                        throw new RuntimeException("Server error " + response.getStatus());
                })
                .map(response -> response.getData())
                .subscribe(items -> {
                    view.setProgressVisible(false);
                    view.updateList(items);
                }, error -> {
                    view.setProgressVisible(false);
                    view.showMessage(resources.getListError());
                }));
            }, error -> {
                view.setProgressVisible(false);
                view.showMessage(resources.getListError());
            }
        )
    );
}

Есть ли лучший способ сделать это, и где я могу ввести switchMap, чтобы отменить любые поиски в полете и обновить только представление с результатами последнего?И если ответ будет кардинально другим, я буду очень признателен за прохождение.

Заранее спасибо !!

1 Ответ

0 голосов
/ 15 февраля 2019

Я не уверен, что это ты хочешь.Но это может дать вам подсказки и решения.Давайте посмотрим код.switchMap получает параметр из поля зрения и меняет observable на resrofit observable.И тогда он возвращает ответ от API call.После всего этого вы можете получить ответ и использовать ответ.

Если код не работает, дайте мне знать.

mCompositeDisposable.add(
        view
                .autocompleteText()
                .debounce(400, TimeUnit.MILLISECONDS)
                .filter({ s -> s.length() >= resources.getAutocompleteThreshold() })
                .observeOn(threads.main())
                .doOnNext({ s -> view.setProgressVisible(true) })
                .map({ s -> s.toString())}
                .switchMap({ text -> mAutocompleteService.query(text))}
                .subscribeOn(threads.io())
                .observeOn(threads.main())
                .retry(3)
                .doOnNext({ response ->
                    if (response.getStatus() !== 200)
                        throw RuntimeException("Server error " + response.getStatus())
                })
                .map({ response -> response.getData() })
                .subscribe({ items ->
                    view.setProgressVisible(false)
                    view.updateList(items)
                }, { error ->
                    view.setProgressVisible(false)
                    view.showMessage(resources.getListError())
                })
)
...