java - 如何在 android-query 中中止 ajax 查询?

标签 java android ajax json android-query

我正在尝试使用 android-query 库实现搜索自动完成

我的 Activity 中有回调实例:

回调:

class SearchCompleteCallback extends AjaxCallback<ItemSearchResult> {
    public void callback(String url, ItemSearchResult searchResult, AjaxStatus status) {
            Log.d("SCB", String.format("Url:%s\n  Msg: %s\n  Code: %s\n  Error: %s",
                                       url,
                                       status.getMessage(),
                                       status.getCode(),
                                       status.getError()));
            if (searchResult != null) {
                Log.d("SCB", String.format("Status: %s\n  Val: %s",
                                           searchResult.getStatus(),
                                           searchResult.getInnGroup().getItems()));
                
                updateSearchResult(searchResult);
            }
            else {
                Log.w("SCB", "Ajax failed");
                
            }
    }
}

搜索例程,调用文本更改:

private void doSearch(String query) {
    ppApi.getSearchResult(query, searchCompleteListener);
}  

API类

public class PPServerApi {
    private AQuery aq;
    private GsonTransformer transformer;
    
    private static class GsonTransformer implements Transformer{
        public <T> T transform(String url, Class<T> type, String encoding, byte[] data, AjaxStatus status) {
            Gson g = new Gson();
            return g.fromJson(new String(data), type);
        }
    }
    
    public PPServerApi(AQuery newAq){
        aq = newAq;
        transformer = new GsonTransformer();
        AQUtility.setDebug(true);
        AjaxCallback.setTransformer(transformer);
    }

    public void getSearchResult(String itemName, AjaxCallback<ItemSearchResult> cb){
            String url = "http://my.api.server/search?q=" + itemName;
            aq.ajax(url, ItemSearchResult.class, cb.header("content-type", "application/json"));
        }
}  

那么,问题是如何在发送新查询之前中止旧查询?
(如果搜索字段中的文本发生更改,我不需要旧查询的结果)

我尝试在 doSearch() 中调用 searchCompleteListener.abort(),但它会导致下一个查询出现异常:

08-09 20:59:10.551: W/AQuery(6854): get:http://my.api.server/search?q=abc
08-09 20:59:10.551: W/AQuery(6854): creating http client
08-09 20:59:10.561: W/AQuery(6854): java.io.IOException: Aborted
08-09 20:59:10.561: W/AQuery(6854):     at com.androidquery.callback.AbstractAjaxCallback.httpDo(AbstractAjaxCallback.java:1569)
...  

所以,在这种情况下我什至无法执行单个查询。

最佳答案

一旦启动,android-query 就无法取消 AJAX 请求。 抱歉,您必须使用另一个库。

可以做的是检查请求完成后是否已过时。

您可以通过检查该 URL 是否与您请求的最新 URL 匹配来做到这一点

if (searchResult != null && url.equals(latestRequestUrl)) {

(注意,您必须让 getSearchResult 返回 URL)

关于java - 如何在 android-query 中中止 ajax 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18152055/

相关文章:

Java JProgressBar不会绘制消耗值

java - 如何从结果集中获得双倍而不是双倍?

java - Android - 在视频上创建圆形蒙版

java - ArrayList 显示为红色且无法编译 --- java android

android - 新安装的 android studio 不会构建新的应用程序

java - Android:以编程方式更改 TextView 位置(左或右)?

javascript - 将数据从一种表单发布到 2 个不同的 url

Java 文件 channel 异常

JQuery Ajax 从单个请求多次触发

javascript - 使用ajax加载html和相对路径