凌空执行异常

Volley ExecutionException

我正在尝试使用 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;
}

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

参数为:

url: http://localhost:13480/api/Account/Register 哈希图:(如 json):

{ "Email": "admin@admin", "Password": "Password12!", "ConfirmPassword": "Password12!" }

自定义请求在这里: Volley - POST/GET parameters 所以我不知道出了什么问题。有帮助吗?

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

您正在尝试 return 您的回复,甚至在收到回复之前(异步调用)。

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

这是我写的 class 的子集,可能会帮助您了解如何正确使用 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

试试改用这个

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);