codenameone – 如何处理几乎同时按下的键?

我正在尝试使用搜索栏解决问题.它的工作原理,但问题是,如果我按下两个键几乎在同一时间,应用程序将只按第一个键搜索词.

这是日志:

在这一个中,当我按下P然后R时它起作用:

[EDT] 0:4:9,283 – p

[EDT] 0:4:9,348 – 10

[EDT] 0:4:9,660 – pr

[EDT] 0:4:9,722 – 3

第二个不是因为我几乎同时按下P和R:

[EDT] 0:4:35,237 – p

[EDT] 0:4:35,269 – pr

[EDT] 0:4:35,347 – 0

[EDT] 0:4:35,347 – 10

生成此处的日志以显示搜索的字符串和结果大小.如您所见,第一个案例在键入下一个字符之前获得结果,第二个案例在键入两个字符时获得所有结果.

主要问题是在第二种情况下,显示’p’字符串的结果而不是’pr’的结果.

我正在使用工具栏API中的搜索栏和addSearchCommand以及InfiniteContainer来显示结果数据.

是否可以解决addSearchCommand事件的顺序问题?

编辑:这是客户端代码.服务器端它只是一个简单的休息服务调用,它从数据库中获取数据.

public static ArrayList<Patient>getSearchedPatient(int index,int amount, String word)
{
    ArrayList<Patient> listPatient = null;
    Response reponse;
    try {
        reponse = RestManager.executeRequest(
            Rest.get(server + "/patients/search")
                .queryParam("index", String.valueOf(index))
                .queryParam("amount", String.valueOf(amount))
                .queryParam("word", word),
            RequestResult.ENTITIES_LIST,
            Patient.class);
        listPatient = (ArrayList<Patient>)reponse.getResponseData();
        Log.p(""+listPatient.size());
    } catch (RestManagerException e) {
        LogError("", e);
    }
    return listPatient; 
}

private static Response executeRequest(RequestBuilder req, RequestResult type, Class objectClass) throws RestManagerException
{

    Response response = null;
    try {
        switch (type) {
        case BYTES:
            response = req.getAsBytes();
            break;
        case JSON_MAP:
            response = req.acceptJson().getAsJsonMap();
            break;
        case ENTITY:
            response = req.acceptJson().getAsProperties(objectClass);
            break;
        case ENTITIES_LIST:
            response = req.acceptJson().getAsPropertyList(objectClass);
            break;
        default:
        case STRING:
            response = req.getAsString();
            break;
        }
    } catch (Exception e) {
        log().error("Erreur à l'exécution de la requête", e);
        response = null;
    }

    if(response == null)
        return null;


    return response;

}

最佳答案 所以这里的诀窍很简单.不要提出请求…大多数用户输入的速度足以使网络连接速度饱和,因此您将看到完成建议,指的是不再相关的内容.

这是一个非平凡的实现,我将在Uber book中进行深入讨论,其中实现了这样的功能.

解决方案是在延迟后发送请求,同时缓存响应以避免双重请求,并在适用时理想地取消正在进行的请求.优步书中的解决方案完成所有3我将尝试仅涵盖此模型代码中的基础知识.首先,您需要一个用于计时器和当前请求的字段.理想情况下,您还可以使用包含缓存数据的Map:

private UITimer delayedRequest;
private String currentSearch;
private Map<String, String> searchCache = new HashMap<>();

然后你需要像这样绑定一个监听器:

tb.addSearchCommand(e -> {
    String s = (String)e.getSource();
    if(s == null) {
       if(delayedRequest != null) {
          delayedRequest.cancel();
          delayedRequest = null;
       }
       return;
    }
    if(currentSearch != null && s.equals(currentSearch)) {
       return;
    }
    if(delayedRequest != null) {
       delayedRequest.cancel();
       delayedRequest = null;
    }
    currenSearch = s;
    delayedRequest = UITimer.timer(100, false, () -> {
         doSearchCode();
    });
});

我没有在此处包含您需要在搜索方法中检查的缓存的使用情况并填写结果代码.我也没有实现已在进行中的取消请求.

点赞