凌空执行异常
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);
我正在尝试使用 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);