Android:在 TextChange 上调用 Retrofit API 的最佳方式

Android : Best Way to Call Retrofit API on TextChange

我已经创建了一个演示来使用 Retrofit 从服务器获取数据列表。我有 50000 多条记录。

现在我已经实现了,

我面临的一个问题:

我听说过 Retrofit Caching 这可能对我有帮助,但不太了解。

提高效率的任何其他解决方案。

这是我在 rxjava 中使用的

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请求将会执行。根据您的要求更改时间

 autocompleteTextView.addRxTextWatcher()
            .debounce(400, TimeUnit.MILLISECONDS)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(AndroidSchedulers.mainThread())
            .subscribe {
                if (!TextUtils.isEmpty(it)) {
                    //DO api request
                }
            }

在java我也认为最好的方法是如下使用RxJava和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() {

                }
            }));
}