2016-01-20 20 views
0

下午好,我有一个问题请看看这个。我可以为每个在EditText中输入的字符开始一个新的线程用于搜索

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

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

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

直到这里我已经完成了。

我的问题是,当我输入名称快,结果是别的。

那么,谁能告诉我如何避免这种情况。

谢谢。

回答

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请求时发送垃圾邮件。

+0

雅这是正确的,但我不希望我的用户输入完整的字符串,而是他们可以使用建议。是的,我在这里使用TextWatcher。 –

+0

好的,然后在发送前坚持取消,这样你就不会有多个电话。 http://square.github.io/retrofit/2.x/retrofit/retrofit2/Call.html#cancel-- –

0

记住搜索文本例如搜索结果中的“AB”。在显示结果之前,请检查当前输入的文本是否仍与搜索结果的文本相匹配,并仅使用结果(如果有)。

搜索“AB”,当前文本“ABC” - >不显示结果。

搜索“ABC”,当前文本“ABC” - >显示结果。

像这样,它将不会影响两个请求返回的顺序,它总是只显示正确的结果。

0

我认为这是不安全的start a new thread for every character

这是我在我的应用程序如何做的:

您可以使用一个队列来存储每一个字符串,用户输入。每次更改edittext时,都会在队列中插入一个新字符串

同时,您可以通过改进来发送异步查询。但如果改造工作正在查询,您不会立即发送,只会将字符串放入队列中。当你的回调函数被retrofit调用时,你可以从队列中除去最新的一个,然后使用retrofit来查询这个最新的查询。

0

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

为每个字符开始一个新的线程并不是可取的,要回答你的问题,每个线程应该不断检查字符的变化,当你输入fast时,它意味着会跳过一些结果,但最终会显示结果正确的最后一个字符串。

相关问题