Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:在TextChange上调用改型API的最佳方式_Android_Web Services_Caching_Search_Retrofit - Fatal编程技术网

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

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

我已经创建了一个演示,以使用改造从服务器获取数据列表。我有50000多张唱片

现在我所实施的

  • 在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() {

                }
            }));
}