【问题标题】:Volley ExecutionExceptionVolley ExecutionException
【发布时间】:2015-05-17 21:18:26
【问题描述】:

我正在尝试使用 volley 实现登录,如下所示:

public static JSONObject register(RequestQueue requestQueue, String url, HashMap<String, String> params) {

    RequestFuture<JSONObject> requestFuture = RequestFuture.newFuture();
    CustomRequest customRequest = new CustomRequest(Request.Method.POST,url,params,requestFuture,requestFuture);
    JSONObject response = null;

    requestQueue.add(customRequest);
    try {
        response = requestFuture.get(30000, TimeUnit.MILLISECONDS);
    } catch (InterruptedException e) {
        L.m(e + "");
    } catch (ExecutionException e) {
        L.m(e + "");
    } catch (TimeoutException e) {
        L.m(e + "");
    }
    return response;
}

但是每当我发送请求时,我都会得到空值作为响应。 Web api 调用有效,它创建了用户,但如果出现重复用户名等错误,我无法获得 json 结果。

参数是:

网址:http://localhost:13480/api/Account/Register 哈希图:(作为json):

{ "电子邮件": "admin@admin", "密码": "密码 12!", “确认密码”:“密码 12!” }

自定义请求在这里: Volley - POST/GET parameters 所以我无法弄清楚出了什么问题。有什么帮助吗?

【问题讨论】:

  • 查看我的答案,它解释了你的代码有什么问题。
  • 谢谢,我去看看试试。
  • 是的,它有所帮助,但在我的情况下它有点复杂,我有一些额外的抽象层。我会弄清楚的:)
  • 好的,现在我明白了,实际上我可以在登录时获得响应,但在注册时,因为我尝试使用相同的用户名注册,我收到 400 错误请求,但我无法获得 json 格式的结果。

标签: android android-volley


【解决方案1】:

试着用这个代替

JsonObjectRequest jr = new JsonObjectRequest(Request.Method.POST, url, params, new Response.Listener<JSONObject>() {
    @Override
    public void onResponse(JSONObject response) {
      // handle the response here 
    }
}, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {

    }
});

    requestQueue.add(jr);

【讨论】:

    【解决方案2】:

    TL,DR.return response; 这个说法是错误的。

    您甚至在得到响应之前就尝试返回响应(异步调用)。

    事实上,volley 异步执行请求,因此您的调用将在请求被服务之前结束其执行,这就是您得到的响应为 null 的原因。

    这是我编写的一个类的子集,它可能会帮助您了解如何正确使用 Volley

    public class SubsetClass {
    
        private Context context;
        String serverURL;
    
        public SubsetClass(Context context) {
            this.context = context;
            serverURL = context.getResources().getString(R.string.serverURL);
        }
    
        private void genericPOSTRequest(Map<String, String> parameters, Response.Listener<String> responseListener, Response.ErrorListener errorListener) {
            GenericRequest gen = new GenericRequest();
            gen.makePOSTRequest(parameters, responseListener, errorListener);
        }
    
        private void genericGETRequest(Map<String, String> parameters, Response.Listener<String> responseListener, Response.ErrorListener errorListener) {
            GenericRequest gen = new GenericRequest();
            gen.makeGETRequest(parameters, responseListener, errorListener);
        }
    
        private class GenericRequest {
    
            private void makePOSTRequest(final Map<String, String> parameters, Response.Listener<String> responseListener, Response.ErrorListener errorListener) {
                RequestQueue queue = Volley.newRequestQueue(context);
                StringRequest stringRequest = new StringRequest(Request.Method.POST, serverURL,
                        responseListener, errorListener) {
                    @Override
                    protected Map<String, String> getParams() throws AuthFailureError {
                        return parameters;
                    }
                };
                queue.add(stringRequest);
            }
    
            private void makeGETRequest(final Map<String, String> parameters, Response.Listener<String> responseListener, Response.ErrorListener errorListener) {
                RequestQueue queue = Volley.newRequestQueue(context);
                StringRequest stringRequest = new StringRequest(Request.Method.GET, serverURL,
                        responseListener, errorListener) {
                    @Override
                    protected Map<String, String> getParams() throws AuthFailureError {
                        return parameters;
                    }
                };
                queue.add(stringRequest);
            }
        }
    }
    

    相关问题

    Volley - POST/GET parameters

    【讨论】:

    • RequestFuture 用于进行同步调用,所以答案不正确
    • @Manish 我已经有几年没有使用 volley 了,但我相信 requestQueue.add(customRequest);将安排稍后执行的请求...
    • 你说得对,requestQueue.add(customRequest);将来会这样做,但在询问的查询中使用了 RequestFuture ,它阻止了进一步的执行,并且同步返回了响应。响应 = requestFuture.get(30000, TimeUnit.MILLISECONDS);同步返回响应。
    猜你喜欢
    • 2014-08-14
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    相关资源
    最近更新 更多