搜索词联想功能实现方案

news/2024/11/8 2:45:23/
需求背景:

实现搜索框的搜索联想功能,当输入框输入字符时候,立刻进行网络请求,将相关推荐展示在下方的列表中,要求每次展示的一定是当前最新输入的内容的推荐词。
在这里插入图片描述

实现思路:

展示搜索词联想需要满足如下三点:
1.搜索框输入内容发生变化需要立刻进行网络请求搜索关联词汇
2.搜索词输入内容变化较快,需要保证每次展示出来的联想词都是输入框中最新的输入内容所对应的联想词
3.每当有新的请求时候需要及时取消掉现在正在进行的网络请求,以免网络资源浪费。
综合以上三点,发现网上上一些现有方案都是基于RXjava实现,在一个外文培训网站发现一个较为完善的方案,通过debounce、filter、distinctUntilChanged、switchMap几个方法来满足以上三点功能,这样原本复杂的逻辑处理就通过简单的几个链式调用完成了,修改补充后的代码如下:

    editText.addTextChangedListener(new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}@Overridepublic void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}@Overridepublic void afterTextChanged(Editable editable) {if (!TextUtils.isEmpty(editText.getText().toString())) {if(publishSubject!=null) {publishSubject.onNext(editText.getText().toString());}} }});private void initPublishSubject() {compositeDisposable = new CompositeDisposable();publishSubject = PublishSubject.create();Disposable disposable = publishSubject.debounce(300, TimeUnit.MILLISECONDS).filter(new Predicate<String>() {@Overridepublic boolean test(String s) throws Exception {if(TextUtils.isEmpty(s)){return false;} else {return true;}}}).distinctUntilChanged().switchMap(new Function<String, ObservableSource<ArrayList<String>>>() {@Overridepublic ObservableSource<ArrayList<String>> apply(String s) throws Exception {return getSearchObservable(s);}}).observeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer() {@Overridepublic void accept(Object o) throws Exception {ArrayList<String> list = (ArrayList<String>)o;if(list!=null && list.size()!=0) {//将返回的联想词展示到列表中}}}, new Consumer<Throwable>() {@Overridepublic void accept(Throwable throwable) throws Exception {MyLog.d(TAG,"fail:" + throwable.getMessage());//因publishSubject如果抛出一次异常就会就会结束,所以在进入异常处理后,再次调用onnext是不会将数据发射出去的,需要重新进行初始化initPublishSubject()}});compositeDisposable.add(disposable);}private Observable<ArrayList<String>> getSearchObservable(final String query) {return Observable.create(new ObservableOnSubscribe<ArrayList<String>>() {@Overridepublic void subscribe(ObservableEmitter<ArrayList<String>> observableEmitter) throws Exception {ArrayList<String> list = new ArrayList<>();try {//通过网络获取联想词,将其赋值给list列表} catch (Exception e) {if (!observableEmitter.isDisposed()) {observableEmitter.onError(e);}}observableEmitter.onNext(list);}}).subscribeOn(Schedulers.io());}

得到搜索联想词之后就是将其填充到recycleview中,这一步较为简单这里不再详述,主要对以上代码中使用的主要RXjava操作符简单解析如下:

1.Debounce

仅在过了一段指定的时间后还没有发射数据时才发射一个数据主要用于过滤掉发射速率太快的数据,比如以上代码中,如果首次输入了a,然后在指定的300毫秒时间间隔内,有输入了b,此时就会过滤掉数据a,重新以ab为开始,重新等待300毫秒,如果这300毫秒内没有新的输入,就发射数据ab,如果有新的输入比如c,就过滤掉数据ab,以数据abc为新的数据继续等待300毫秒,如果300毫秒时间到了,没有新的输入,就发射数据abc,这样的好处是过滤掉了一些中间不必要的数据。

2.Filter:

使用一个指定的函数测试数据,只有通过测试的数据才能够发射,比如以上代码中,只有非空的数据才能够发射,空数据则过滤掉

3.DistinctUntilChanged:

DistinctUntilChanged与distinct操作符类似,功能都是避免重复,只允许通过未发射过的数据,假设最后一个请求的搜索词是abc,然后用户又马上删除了C,然后又再次输入一个c这样搜索词依然是abc,这样最后的这个abc的请求就会过滤掉。

4.SwitchMap:

switchMap运算符用于避免多余的网络呼叫结果,该结果对于显示给用户而言并不需要更多,只需要最新一次的结果即可。假设最后输入的是ab,如果正在进行ab的联想词请求时候用户又继续输入了c,此时用户只对abc的联想词感兴趣,而不再需要ab的联想词,switchMap正好可以解决这个问题,它仅返回最新的搜索结果而忽略掉之前在进行的请求。


http://www.ppmy.cn/news/355840.html

相关文章

联想服务器控制口登录地址_联想服务器登录管理界面 联想服务器客服

联想服务器怎么进bio? 首先打开电脑。当电脑屏幕上出现“联想”屏幕时,左下角会出现“按F2设置”字样。此时,快速按键盘上的“F2”键进入BIOS设置,如下图所示 联想如何进入BIOS 下一步,电脑将进入硬件BIOS设置界面,如下图所示 联想如何进入BIOS 当我们设置完电脑的BIOS后…

联想E475笔记本进入BOIS设置U盘启动顺序、

U大师装机 1、长按F1进入BOIS程序设置界面 2、找到 Security ---Secure Boot 改为Disabled 3、-----Startup --UEFI / Legacy Boot 改为 Legacy 0nly 4、----Startup ---将USB HDD U盘启动顺序 改为第一位 5、插入U盘 进入U大师装机系统 进入ISOS文件夹 选择镜像…

联想E4430 蓝屏代码0x0000007B

开机使用QQ没多久, 系统直接卡着不动了, 等了几分钟依然没任何反应, 就按住开机键进行强制关机, 结果直接蓝屏! 蓝屏代码: 0x0000007B 解决方案: 1. 开机后, 在出现联想图标后, 按回车键interrupt启动顺序, 按F1进入BIOS设置 2. 在config -> serial ATA选项中, 将模式由A…

框架篇面试详解

spring AOP AOP称为面向切面编程&#xff0c;用于将那些与业务无关&#xff0c;但却对多个对象产生影响的公共行为和逻辑&#xff0c;抽取并封装成为一个可重用的模块&#xff0c;这个模块被命名为“切面”&#xff08;Aspect&#xff09;&#xff0c;减少系统中的重复代码&am…

酒店(宾馆)客房管理系统

下载源代码&#xff1a;酒店&#xff08;宾馆&#xff09;客房管理系统源代码 http://free3.e-168.cn/yumvis/jdgl.rar

汉庭加盟:连锁酒店影视房的市场分析

汉庭加盟项目负责人表示,快捷连锁酒店影视房Z大特点是房价便宜,其服务模式为“住宿和早餐”,以价格低廉、设施简洁、安全、干净和性价比高的酒店模式。在快捷酒店还未兴起时,多数酒店都是以独立经营模式,酒店服务项目多比如餐饮、娱乐、桑拿等,人员配置较多,浪费和占有很多资源…

酒店电视方案 酒店建设高清数字电视系统的解决方案

近年来&#xff0c;随着互联网的发展&#xff0c;数字电视系统已经成为趋势。酒店作为旅游休闲的重要场所&#xff0c;为宾客提供高清的电视信号是非常有必要的。数字电视接入系统是宾客了解酒店资讯、观看电视电影、进行娱乐放松等的重要载体&#xff0c;其电视信号的质量对于…

关于酒店业务的介绍

用户在网站浏览酒店信息&#xff0c;可以根据solr关键字检索出该地区的酒店信息。这样用户可以看到周边都有哪些酒店。 然后点击进入酒店详情列表展示酒店的详细信息。酒店信息构成&#xff1a;酒店的名称&#xff0c;酒店图片&#xff0c;酒店位置&#xff0c;评论人数&#…