我可以为在 EditText 中输入的每个字符启动一个新线程以进行搜索吗
Can i start a new Thread for every character entered in EditText for searching
下午好,有问题请看这里
我正在使用 Retrofit beta 2 从 api 中检索数据。我有一个 EditText,我想在其中从服务器搜索一些名称。我也得到了输出,但是例如考虑有一些名字:
ABC、XYZ、PQR、STU、等。这些是存储在服务器中的名称,我正在使用 Retrofit beta2 检索这些名称。
当我搜索 ABC 或 abc 时,它会显示结果,而当我从 EditText 中删除字符串时,则不会显示任何内容。
至此我已经完成了。
我的问题是,当我快速输入名称时,结果是其他的。
所以,谁能告诉我如何避免这种情况。
谢谢。
记住搜索文本,例如"AB" 在搜索结果上。在显示结果之前,检查当前输入的文本是否仍然匹配搜索结果的文本,如果匹配则只使用结果。
已搜索 "AB",当前文本 "ABC" -> 不显示结果。
已搜索 "ABC",当前文本 "ABC" -> 显示结果。
像这样,两个请求的顺序都不重要return,它总是只显示正确的结果。
我认为start a new thread for every character
不安全
这是我在应用程序中的做法:
您可以使用队列来存储用户输入的每个字符串。每次edittext改变,一个新的字符串将被插入到队列中
同时,您可以通过改造将查询异步发送。但是如果改装正在查询的途中,您不会立即发送,只是将字符串放入队列中。当你的回调函数被 retrofit 调用时,你可以从队列中删除除最新的字符串之外的所有字符串,然后使用 retrofit 来查询这个最新的查询。
Call
对象有几个实用方法,您可以使用 isExecuted
和 cancel
来控制您的请求。
http://square.github.io/retrofit/2.x/retrofit/retrofit2/Call.html
我假设您正在使用 TextWatcher
。 Pseudo-code如下:
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
}
一般来说,ill-advised 听取用户的即时输入以产生一个动作:你应该重新考虑你的方法;最好放一个 "submit" 或按钮来执行 API 调用;否则你将向服务器发送垃圾邮件,每个输入有多个 HTTP 请求。
线程太多,会影响任何设备的性能,因为它涉及的开销会消耗大量资源。
绝不建议为每个字符启动一个新线程,回答你的问题每个线程都应该不断检查字符的变化,当你快速键入时,这意味着往往会跳过一些结果但最终会显示最后一个字符串的结果正确。
下午好,有问题请看这里
我正在使用 Retrofit beta 2 从 api 中检索数据。我有一个 EditText,我想在其中从服务器搜索一些名称。我也得到了输出,但是例如考虑有一些名字:
ABC、XYZ、PQR、STU、等。这些是存储在服务器中的名称,我正在使用 Retrofit beta2 检索这些名称。
当我搜索 ABC 或 abc 时,它会显示结果,而当我从 EditText 中删除字符串时,则不会显示任何内容。
至此我已经完成了。
我的问题是,当我快速输入名称时,结果是其他的。
所以,谁能告诉我如何避免这种情况。
谢谢。
记住搜索文本,例如"AB" 在搜索结果上。在显示结果之前,检查当前输入的文本是否仍然匹配搜索结果的文本,如果匹配则只使用结果。
已搜索 "AB",当前文本 "ABC" -> 不显示结果。
已搜索 "ABC",当前文本 "ABC" -> 显示结果。
像这样,两个请求的顺序都不重要return,它总是只显示正确的结果。
我认为start a new thread for every character
这是我在应用程序中的做法:
您可以使用队列来存储用户输入的每个字符串。每次edittext改变,一个新的字符串将被插入到队列中
同时,您可以通过改造将查询异步发送。但是如果改装正在查询的途中,您不会立即发送,只是将字符串放入队列中。当你的回调函数被 retrofit 调用时,你可以从队列中删除除最新的字符串之外的所有字符串,然后使用 retrofit 来查询这个最新的查询。
Call
对象有几个实用方法,您可以使用 isExecuted
和 cancel
来控制您的请求。
http://square.github.io/retrofit/2.x/retrofit/retrofit2/Call.html
我假设您正在使用 TextWatcher
。 Pseudo-code如下:
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
}
一般来说,ill-advised 听取用户的即时输入以产生一个动作:你应该重新考虑你的方法;最好放一个 "submit" 或按钮来执行 API 调用;否则你将向服务器发送垃圾邮件,每个输入有多个 HTTP 请求。
线程太多,会影响任何设备的性能,因为它涉及的开销会消耗大量资源。
绝不建议为每个字符启动一个新线程,回答你的问题每个线程都应该不断检查字符的变化,当你快速键入时,这意味着往往会跳过一些结果但最终会显示最后一个字符串的结果正确。