需求背景:

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

实现思路:

展示搜索词联想需要满足如下三点:
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正好可以解决这个问题,它仅返回最新的搜索结果而忽略掉之前在进行的请求。

搜索词联想功能实现方案相关推荐

  1. JavaScript 实现搜索框联想功能

    基础 HTML 代码 实例 <!-- autocomplete="off" 确保表单已关闭自动填充功能: --> <form autocomplete=" ...

  2. 字符串匹配数据结构 --Trie树 高效实现搜索词提示 / IDE自动补全

    文章目录 1. 算法背景 2. Trie 树实现原理 2.1 Trie 树的构建 2.2 Trie树的查找 2.3 Trie树的遍历 2.4 Trie树的时间/空间复杂度 2.5 Trie 树 Vs ...

  3. php 实现联想式 搜索,PHP实现搜索联想功能(基于字典树算法)

    搜索联想功能是各大搜索引擎具备的基础功能,如下图所示,这个功能简化了用户的输入行为,并且能够给用户推荐热门的搜索词,下面我们来讲一下如何用php实现搜索联想的功能. 实现原理 搜索联想功能拆解一下由两 ...

  4. android mysql 搜索功能_android利用数据库实现搜索联想功能

    [实例简介] android利用数据库实现搜索联想功能.主要实现的效果是和google百度搜索一样,实现联想功能. [实例截图] [核心代码] 4e431bd8-d287-4028-8476-7510 ...

  5. javascript搜索框联想搜索_JavaScript实现搜索联想功能

    -.虽然Jquery已经有了一个完整的包 实现前端搜索联想功能,但是出于学习还是想了解一下实现此功能的原理性 回想起来 实现此功能很简单,1.前端输入字符串 文本改变 异步请求服务器 将返回的资料显示 ...

  6. 搜索词纠错、相关搜索的原理与实现

    相关搜索是检索功能的一个扩展,用来告诉用户自己输入查询词的情况. 如果输入错了,可能会纠错提示用户:"想找的是不是" . 另外还会在显著位置提供与输入查询词相关的其他查询词,例如百 ...

  7. Elasticsearch 搜索的高级功能学习

    在文章 Elasticsearch 入门学习 中介绍了 Elasticsearch 的基础概念以及一些常用的 API.这篇文章是继续对 Elasticsearch 中一些高级的搜索功能的学习和总结: ...

  8. 站长工具|百度搜索框提示功能

    百度向站长开放免费"百度搜索框"代码和"百度搜索框提示"代码.只需进行简单的设置, 即可将" 百度搜索框( 带提示功能)"功能快速加入到您的 ...

  9. 【实践】多场景下的搜索词推荐算法及在腾讯的应用实践.pdf(附下载链接)

    猜你喜欢 0.[免费下载]2021年11月热门报告盘点1.如何搭建一套个性化推荐系统?2.从零开始搭建创业公司后台技术栈3.全民K歌推荐系统算法.架构及后台实现4.微博推荐算法实践与机器学习平台演进5 ...

最新文章

  1. 美国计算机科学发展,美国计算机工程发展现状
  2. 多线程介绍和多线程模块-lock-互斥锁
  3. 计算几何相关资料+题目推荐(不定期补充)
  4. wordpress如何屏蔽wp-json(禁用REST API)
  5. Python+numpy实现函数向量化
  6. 原生js 实现购物车价格和总价 统计
  7. 一个网站 一个域名跟服务器吗,域名服务器与根服务器区别吗
  8. 项目管理:如何制作项目进度表
  9. 解决安装闪退打不开问题,Sketch v84 Mac中文版已更新。支持M1intel处理器,支持monterey最新系统
  10. linux系统怎么拨号上网,linux配置上网 linux adsl拨号上网设置
  11. 百度快照劫持代码的更新
  12. Linux Cannot assign requested address
  13. Centos7 安装VLC播放器
  14. python剔除st股_如何判断某只股票过去是不是ST股
  15. C#学习(十五)——窗体控件用法大全
  16. 动态规划--数位dp--二进制状态压缩
  17. CI(CodeIgniter)框架入门
  18. 机器学习笔记 - 什么是UMAP?
  19. mysql 中查询字段信息(字段注释和字段类型)
  20. 如何破解联网收费软件,求高手指点

热门文章

  1. u盘软件怎么安装linux,教你怎么使用u盘安装Linux平台
  2. Android--万能自定义弹窗
  3. 【2022年第一期 CANN训练营学习笔记】进阶班应用开发课 大作业1-开发DVPP应用,输入,输出都是JPEG图片,且分辨率不同
  4. 选择的串口 _ 不存在或开发板没有连接_PC 和开发板之间传输文件
  5. matlab ncut谱聚类,NCUT 归一化分割、谱聚类之代码调试问题
  6. 如何来做移动端网站SEO
  7. KITTI数据集去除camera生成bag包(kitti2bag)
  8. HTML5+CSS3期末大作业:电影网站设计——黑色扁平的电影工作室静态网页 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码
  9. 【操作系统原理】信号量及PV操作详解
  10. 妹子找你修电脑,按照这几步操作,你就是黑客大佬!