Android:在 TextChange 上调用 Retrofit API 的最佳方式
Android : Best Way to Call Retrofit API on TextChange
我已经创建了一个演示来使用 Retrofit 从服务器获取数据列表。我有 50000 多条记录。
现在我已经实现了,
- 在 SearchView 中写入 3 个字符后调用 API
- 之后,在每个字符按下事件时调用 API。
我面临的一个问题:
- 加载项目太慢,
- 每次按键时的 API 请求太多(任何使其更有效的解决方案)
我听说过 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() {
}
}));
}
我已经创建了一个演示来使用 Retrofit 从服务器获取数据列表。我有 50000 多条记录。
现在我已经实现了,
- 在 SearchView 中写入 3 个字符后调用 API
- 之后,在每个字符按下事件时调用 API。
我面临的一个问题:
- 加载项目太慢,
- 每次按键时的 API 请求太多(任何使其更有效的解决方案)
我听说过 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() {
}
}));
}