Android:在TextChange上调用改型API的最佳方式
我已经创建了一个演示,以使用改造从服务器获取数据列表。我有50000多张唱片 现在我所实施的Android:在TextChange上调用改型API的最佳方式,android,web-services,caching,search,retrofit,Android,Web Services,Caching,Search,Retrofit,我已经创建了一个演示,以使用改造从服务器获取数据列表。我有50000多张唱片 现在我所实施的 在SearchView中写入3个字符后调用API 之后,在每个字符按下事件上调用API 我面临的一个问题是: 加载项目太慢 每次按键都有太多的API请求(任何使其更有效的解决方案) 我听说这可能对我有帮助,但我不知道更多 任何其他提高效率的解决方案。这就是我在rxjava中使用的 为AutoCompleteTextView fun AutoCompleteTextView.addRxTextWa
- 在SearchView中写入3个字符后调用API
- 之后,在每个字符按下事件上调用API
- 加载项目太慢
- 每次按键都有太多的API请求(任何使其更有效的解决方案)
任何其他提高效率的解决方案。这就是我在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
}
在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() {
}
}));
}
compositeDisposable.add(RxTextView.textchangevents(searchEditText)
.skipInitialValue()
.去盎司(300,时间单位。微秒)
.distinctUntilChanged()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribowith(新可处置观察员){
@凌驾
public void onNext(TextViewTextChangeEvent TextViewTextChangeEvent){
adapter.getFilter().filter(textViewTextChangeEvent.getText());
Log.d(Log_标签,“值seached”+textViewTextChangeEvent);
//adapter.notifyDataSetChanged();
}
@凌驾
公共无效申报人(可丢弃的e){
d(Log_标记,“从搜索中获得的错误:+e.getMessage());
}
@凌驾
未完成的公共空间(){
}
}));
}
之后,在每个字符按下事件上调用API。
,为什么?在发送请求之前,我会等到某种空闲时间<代码>我有50000多条记录。分页?您可以使用Kotlin协同程序进行搜索。@Blackbelt是的,一种方法是等待片刻并调用API。主要的问题是,我必须从50k+记录中搜索它。我想我们有RxJava。在RxJava的帮助下,您可以同时完成所有工作。查看本文使用Filter
:文档中说“通过调用Filter(CharSequence)或Filter(CharSequence,android.widget.Filter.FilterListener)执行的过滤操作”异步执行。调用这些方法时,将在请求队列中发布筛选请求,并在以后进行处理。对其中一个方法的任何调用都将取消以前未执行的筛选请求。“
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() {
}
}));
}