Java 截击请求管理器

Java 截击请求管理器,java,android,json,android-volley,Java,Android,Json,Android Volley,我使用的是Volley,但我在JSON解析数据方面遇到了一些问题,很可能是因为Volley没有实现类似AsyncTask的onPostExecute之类的功能,并且我在错误的列表项上获得了一些重复数据 然后我遇到了这样一个问题: 有人用过吗?如何将其添加到当前的截击代码中 更多关于我的问题的细节在这里 更新 根据要求,提供了一些代码。下面是一个按钮,该按钮调用另一个类上的方法,该类使用Volley请求一些原始JSON数据NovaJSON,然后将JSON发送到解析器类NovaParser:

我使用的是Volley,但我在JSON解析数据方面遇到了一些问题,很可能是因为Volley没有实现类似AsyncTask的onPostExecute之类的功能,并且我在错误的列表项上获得了一些重复数据

然后我遇到了这样一个问题:

有人用过吗?如何将其添加到当前的截击代码中

更多关于我的问题的细节在这里

更新

根据要求,提供了一些代码。下面是一个按钮,该按钮调用另一个类上的方法,该类使用Volley请求一些原始JSON数据NovaJSON,然后将JSON发送到解析器类NovaParser:

    info.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String instanceDetail = NovaJSON.shared().receiveDetail(getId());
            Dialog dialog = new Dialog(v.getContext());
            dialog.setContentView(R.layout.instances_info);
            TextView image = (TextView) dialog.findViewById(R.id.imageInstance);
            TextView flavor = (TextView) dialog.findViewById(R.id.flavorInstance);
            dialog.setTitle(name.getText() + " Details");
            if (instanceDetail != null) {
                image.setText(" \u2022 image : " + NovaParser.shared().parseImages(instanceDetail));
                flavor.setText(" \u2022 flavor : " + NovaParser.shared().parseFlavor(instanceDetail));
            }
            dialog.show();
        }
    });
这是对NovaJSON类执行截击请求的方法:

    public void getJSONdetail() {
    final String authToken = getAuth();
    String novaURL = getNova();
    novaURL = novaURL+"/servers/"+id;


    JsonObjectRequest getRequest = new JsonObjectRequest(Request.Method.GET, novaURL, null,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    Log.d("Nova on Response", response.toString());
                    setNovaJSONdetail(response.toString());
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    VolleyLog.d("Nova on Error", "Error: " + error.getMessage());
                    setNovaJSONdetail(error.toString());
                }
            }
    ) {
        public Map<String, String> getHeaders() throws AuthFailureError {
            Map<String, String> params = new HashMap<String, String>();
            params.put("X-Auth-Token", authToken);
            params.put("User-Agent", "stackerz");
            params.put("Accept", "application/json");
            params.put("Content-Type", "application/json; charset=utf-8");
            return params;
        }

    };


    queue = VolleySingleton.getInstance(this).getRequestQueue();
    queue.add(getRequest);
}
然后,它将JSON作为字符串从服务器发送,并使用以下方法进行解析:

public static String parseImages(String imagesDetail){
    ArrayList<HashMap<String, String>> imagesList = NovaParser.shared().getImagesList();
    String temp = null;
    JSONObject novaDetail = null;
    try {
        novaDetail = new JSONObject(imagesDetail);
        JSONObject server = novaDetail.getJSONObject("server");
        JSONObject image = server.getJSONObject("image");
        if (imagesList !=null){
            temp = image.getString("id");
            for (Map<String,String> map : imagesList) {
                if (map.containsValue(temp)) {
                    temp = map.get(NAME);
                }
            }
        }

    } catch (JSONException e) {
        e.printStackTrace();
    }

    return temp;
}

public static String parseFlavor(String instanceDetail){
    ArrayList<HashMap<String, String>> flavorList = NovaParser.shared().getFlavorList();
    String temp = null;
    JSONObject novaDetail = null;
    try {
        novaDetail = new JSONObject(instanceDetail);
        JSONObject server = novaDetail.getJSONObject("server");
        JSONObject flavor = server.getJSONObject("flavor");
        if (flavorList !=null){
        temp = flavor.getString("id");
        for (Map<String,String> map : flavorList) {
            if (map.containsValue(temp)) {
                temp = map.get(NAME);
            }
        }
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }

    return temp;
}
当我按下按钮时,对话框显示为空值。当我第二次按下它时,我得到了正确的解析数据。基本上,我第一次单击按钮时,instanceDetail字符串为空,因为Volley没有完成它的工作,然后我第二次单击,它相应地加载值,因为它最终完成了第一个请求


我知道截击是异步的,请求是并行的,响应有时不是即时的,但是我需要一些进度条或旋转的轮子来给用户一些反馈,应用程序正在等待数据。这可以用AsyncTask来完成,但是截击似乎不可能。我认为你的问题不是因为截击。 检查您发送和接收的参数。 但是,如果您需要onPostExcecute,您可以使用截击回叫: 请求后调用的Response.Listener和Response.ErrorListener


关于截击请求管理器只需将所有截击呼叫切换为相应的截击请求管理器呼叫

我解决了我的问题,将截击全部丢弃,然后进行改装。我将所有调用设置为sync/blocking,使用try/catch解决异常/错误,并在OkHTTP客户端上设置一个短超时。现在,它正按我所希望的那样工作。

Volley的问题是它如何处理请求。例如,如果我有一个按钮,在我第一次单击该按钮时触发一个截击请求,以更改默认值为name的文本视图,那么我将获得name,然后我必须第二次单击以获得我期望的实际值。使用onPostExecute,它将等待请求完成,并立即给我正确的输出。。。请参见更新和单击执行的对话框?它仅显示项目的图像名称和味道类型。只是从服务器上获取的信息数据