最近遇到一个搜索方面的bug,
背景:在TextView的afterTextChange回调中,实时使用textview中的字符串发起请求,但是一些输入法在输入 “(”时,会自动补齐为“()”,这样会发起两次搜索,且时差非常非常小(毫秒级),由于服务端的查询速度及网络速度的问题,可能出现“()”的搜索结果比“(”先回调的情况,导致搜索结果错误。想到的解决办法有三种:
1⃣️延迟搜索,不实时搜索,例如每500ms发起一次搜索
优点:简单,修改代码量少
缺点:不能完全避免这种情况,且牺牲了绝大部分正常场景下的搜索速度
2⃣️在updateData的时候把request里面的key一起传回来,与textView中的文字对比,相等才更新界面,否则忽略
优点:不用牺牲绝大部分场景的用户体验,达到预期的正确效果,代码修改量也很小
缺点:同样的搜索词,可能导致页面闪动 比如搜索 (、()、( 这三个字符串 两次的“(”会导致两次刷新,页面闪动)
3⃣️每一次发起搜索的时候,cancel掉前面的所有搜索的请求
优点:真正从技术层面解决了请求时序的问题,只保留最后一次请求
缺点:没什么缺点,存在一些难点
下面具体说一下对方法3⃣️的研究过程,在发起网络请求的队列中进行管理,对搜索打上标签,每次有新的请求时