Android: лучший способ вызвать модифицированный API на TextChange - PullRequest
1 голос
/ 09 января 2020

Я создал одну демонстрацию, чтобы получить список данных с сервера, используя Retrofit. У меня 50000+ записей.

Теперь, что я реализовал,

  • Вызов API после 3 символов, написанных в SearchView
  • После этого вызов API для каждого символа нажмите event.

Проблема, с которой я сталкиваюсь:

  • Слишком медленная загрузка элементов,
  • Слишком много запросов API при каждом нажатии клавиши (любое решение для сделать его более эффективным)

Я слышал о Кешировании модернизации , которое может помочь мне, но я не знаю об этом больше.

Любое другое решение, чтобы сделать его более эффективным.

Ответы [ 2 ]

1 голос
/ 09 января 2020

Это то, что я использую с rx java

. Создайте функцию расширения для AutoCompleteTextView

fun AutoCompleteTextView.addRxTextWatcher(): Observable<String?> {

    val flowable = Observable.create<String?> {
        addTextChangedListener(object : TextWatcher {
            override fun afterTextChanged(s: Editable?) {
            }

            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {

                it.onNext(s?.toString())
            }

            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
            }
        })
    }

    return flowable
}

и для AutocompleteTextView добавьте стратегию отладки. Здесь я добавил время 400 миллисекунд, если в течение 400 мс пользовательский ввод отсутствует, запрос API будет go. изменить время согласно вашему требованию

 autocompleteTextView.addRxTextWatcher()
            .debounce(400, TimeUnit.MILLISECONDS)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(AndroidSchedulers.mainThread())
            .subscribe {
                if (!TextUtils.isEmpty(it)) {
                    //DO api request
                }
            }
0 голосов
/ 09 января 2020

В java Я также думаю, что лучше всего использовать Rx Java и RxBinding следующим образом

 compositeDisposable.add(RxTextView.textChangeEvents(searchEditText)
            .skipInitialValue()
            .debounce(300, TimeUnit.MICROSECONDS)
            .distinctUntilChanged()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeWith(new DisposableObserver<TextViewTextChangeEvent>() {
                @Override
                public void onNext(TextViewTextChangeEvent textViewTextChangeEvent) {

adapter.getFilter().filter(textViewTextChangeEvent.getText());
                    Log.d(LOG_TAG, "The value seached "+ textViewTextChangeEvent);
                 //   adapter.notifyDataSetChanged();
                }

                @Override
                public void onError(Throwable e) {
                    Log.d(LOG_TAG, "The error gotten from search: "+ e.getMessage());
                }

                @Override
                public void onComplete() {

                }
            }));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...