项目里有这么一个需求,如果用户进入一个搜索页面,页面顶端有一个搜索框,用户在输入的同时,底下同步的展示相关搜索建议。大约是这个样子:
大体逻辑如下:
实现功能:在输入的同时根据输入的文字立即给出结果,服务器端使用solaris做内存上的缓存。
关键地方在于:
1、用户输入完毕之后要尽可能快的响应
2、尽可能的为搜索服务器降低压力
3、将网络带宽资源最大化的用在用户真正需要的搜索结果上
注:本文只讨论客户端的优化,服务器搜索优化暂不涉及
这个功能出现了很久,直到最近才开始修改,并且连改三个版本
第一版:监听EditTextView的TextChanged事件,每次当用户在搜索框输入或者删除一个字符,就用当前输入框里的文字发起一次搜索请求,并在请求结束后的回调函数中,判断之前请求的文字和当前输入框里文字是否相同,如果相同就显示
优点:实时性强,用户输入完毕之后立刻发出请求,不需等待
缺点:由于http请求线程池有限,允许的并发量很小,也许新请求的关键字需要排队,也就是等之前关键字搜索完毕之后再进行请求,实际上用户等待的时间会很长。并且给搜索服务器带来了极大的压力
第二版:设置一个定时器,每1.5s检测一下搜索框中的内容,如果内容发生改变,就发起一次Http请求,并通过OkHttp将之前全部的关键字请求都取消掉,减少并发。
优点:减少了并发Http请求的队列等待,为服务器减少了压力
缺点:1.5秒的扫描间隔比较长,用户需要多付出无谓的1.5s等待时间,极大的降低了用户体验
第三版:启动一个子线程进行维护,用户每输入一个字母后等待500ms,如果500ms内用户没有输入其他字符,就搜索当前搜索框里的文字,如果500ms以内用户又继续输入了文字,就重新开始500ms的等待
第四版: