Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 我可以为EditText中输入的每个字符启动一个新线程进行搜索吗_Android_Search_Retrofit_Textwatcher - Fatal编程技术网

Android 我可以为EditText中输入的每个字符启动一个新线程进行搜索吗

Android 我可以为EditText中输入的每个字符启动一个新线程进行搜索吗,android,search,retrofit,textwatcher,Android,Search,Retrofit,Textwatcher,下午好,我有个问题,请看这个 我使用改型beta 2从api检索数据。我有一个EditText,我想在其中搜索服务器上的一些名称。我也得到了输出,但是例如,考虑有一些名称: ABC、XYZ、PQR、STU等。这些是存储在服务器中的名称,我正在使用翻新beta2检索这些名称 当我搜索ABC或ABC时,它将显示结果,当我从EditText中删除字符串时,将不显示任何内容 直到现在我已经完成了 我的问题是,当我快速键入名称时,结果是另一种情况 那么,谁能告诉我如何避免这种情况 谢谢。记住搜索结果上的搜

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

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

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

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

直到现在我已经完成了

我的问题是,当我快速键入名称时,结果是另一种情况

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


谢谢。

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

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

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


这样,两个请求返回的顺序都无关紧要,它总是只显示正确的结果。

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

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

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


这样,两个请求返回的顺序都无关紧要,它总是只显示正确的结果。

我认为为每个字符启动一个新线程是不安全的

我在我的应用程序中就是这样做的:

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


同时,可以通过改造异步发送查询。但是,如果改造正在进行中,您不会立即发送,只会将字符串放入队列中。当您的回调函数被改型调用时,您可以从队列中删除除最新字符串以外的所有字符串,然后使用改型来查询此最新查询。

我认为为每个字符启动一个新线程是不安全的。

我在我的应用程序中就是这样做的:

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


同时,可以通过改造异步发送查询。但是,如果改造正在进行中,您不会立即发送,只会将字符串放入队列中。当您的回调函数被改型调用时,您可以从队列中删除除最新字符串以外的所有字符串,然后使用改型来查询此最新查询。

调用对象有两种实用方法,您可以使用它们来控制您的请求,即
isExecuted
cancel

我假设您正在使用
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请求。

调用对象有两个实用方法,您可以使用它们来控制请求,即
isExecuted
cancel

我假设您正在使用
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请求。线程过多会影响任何设备的性能,因为这会消耗大量资源


为每个字符启动一个新线程绝非明智之举,为了回答您的问题,每个线程都应该不断检查字符的变化,当您快速键入时,这意味着可能会跳过某些结果,但最终会正确显示最后一个字符串的结果。

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


为每个字符启动一个新线程绝对不可取,为了回答您的问题,每个线程都应该不断检查字符的变化,当您快速键入时,这意味着可能会跳过某些结果,但最终会正确显示最后一个字符串的结果。

Ya这是正确的,但我不希望我的用户键入完整的字符串,相反,他们可以使用建议。是的,我用的是TextWatcher。好吧,在发送之前请坚持取消,这样你就不会有多个电话了。是的,这是正确的,但我不希望我的用户键入完整的字符串,相反,他们可以使用建议。是的,我用的是TextWatcher。好吧,在发送之前请坚持取消,这样你就不会有多个电话了。