下午好,我有一个问题,请看看这个。
我正在使用Retrofit beta 2从api中检索数据。我有一个EditText,我想从服务器中搜索一些名称。我也得到了输出,但是例如考虑有一些名字:
ABC,XYZ,PQR,STU,ETC。这些是存储在服务器中的名称,我正在使用Retrofit beta2检索此名称。
当我搜索ABC或abc时,它会显示结果,当我从EditText中删除字符串时,则不显示任何内容。
直到我完成了。
我的问题是,当我快速键入名称时,结果就是其他内容。
所以,任何人都可以告诉我如何避免这种情况。
谢谢。
答案 0 :(得分:1)
请记住搜索文字,例如" AB"在搜索结果上。在显示结果之前,检查当前输入的文本是否仍然与搜索结果的文本匹配,如果是,则仅使用结果。
搜索" AB",当前文字" ABC" - >不要显示结果。
搜索" ABC",当前文字" ABC" - >显示结果。
就像这样,它甚至不知道两个请求返回的顺序,它总是只显示正确的结果。
答案 1 :(得分:1)
Call
对象有几种实用方法,即isExecuted
和cancel
来控制您的请求。
http://square.github.io/retrofit/2.x/retrofit/retrofit2/Call.html
我假设您正在使用TextWatcher
。伪代码如下:
public void afterTextChanged (Editable s) {
// Cancel the request first before sending it again; this way you won't have two separate calls
if(call != null && call.isExecuted()) {
call.cancel();
}
// reinitialize call and execute it again
}
一般来说,听取用户立即输入以产生动作是不明智的:你应该重新考虑你的方法;最好放一个“提交”或按钮来执行API调用;否则你会在每次输入时发出几个HTTP请求的垃圾邮件。
答案 2 :(得分:0)
我认为start a new thread for every character
这就是我在我的应用程序中所做的:
您可以使用队列来存储用户输入的每个字符串。每次编辑文本更改时,都会将新字符串插入队列
同时,您可以通过改造发送查询异步。但如果改造正在查询中,则不要立即发送,只将字符串放入队列中。当您通过改造调用回调函数时,您可以从队列中删除除最新字符串之外的所有字符串,然后使用翻译来查询此最新查询。
答案 3 :(得分:0)
线程太多,会影响任何设备的性能,因为它涉及的开销会占用大量资源。
为每个字符开始一个新线程绝对不建议,回答你的问题,每个线程应该不断检查字符的变化,当你快速输入时,它意味着倾向于跳过一些结果,但最终会显示结果最后一个字符串正确。