我可以为在EditText中输入的每个字符开始一个新线程进行搜索

时间:2016-01-20 08:24:26

标签: android search retrofit textwatcher

下午好,我有一个问题,请看看这个。

我正在使用Retrofit beta 2从api中检索数据。我有一个EditText,我想从服务器中搜索一些名称。我也得到了输出,但是例如考虑有一些名字:

ABC,XYZ,PQR,STU,ETC。这些是存储在服务器中的名称,我正在使用Retrofit beta2检索此名称。

当我搜索ABC或abc时,它会显示结果,当我从EditText中删除字符串时,则不显示任何内容。

直到我完成了。

我的问题是,当我快速键入名称时,结果就是其他内容。

所以,任何人都可以告诉我如何避免这种情况。

谢谢。

4 个答案:

答案 0 :(得分:1)

请记住搜索文字,例如" AB"在搜索结果上。在显示结果之前,检查当前输入的文本是否仍然与搜索结果的文本匹配,如果是,则仅使用结果。

搜索" AB",当前文字" ABC" - >不要显示结果。

搜索" ABC",当前文字" ABC" - >显示结果。

就像这样,它甚至不知道两个请求返回的顺序,它总是只显示正确的结果。

答案 1 :(得分:1)

Call对象有几种实用方法,即isExecutedcancel来控制您的请求。

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)

线程太多,会影响任何设备的性能,因为它涉及的开销会占用大量资源。

为每个字符开始一个新线程绝对不建议,回答你的问题,每个线程应该不断检查字符的变化,当你快速输入时,它意味着倾向于跳过一些结果,但最终会显示结果最后一个字符串正确。