我想使用volley库进行同步请求,我使用了以下代码:
RequestFuture<Long> future = RequestFuture.newFuture();
AuthenticatedJsonRequest request = new AuthenticatedJsonRequest(Method.GET,ServiceUrl,null,future,future);
requestQueue.add(request);
try {
Long response = future.get();
但代码在这里永远阻止:
Long response = future.get();
这是我的自定义JsonRequest
public class AuthenticatedJsonRequest extends JsonRequest<Long> {
public AuthenticatedJsonRequest(int method, String url, String requestBody, Listener<Long> listener,
ErrorListener errorListener) {
super(method, url, requestBody, listener, errorListener);
// TODO Auto-generated constructor stub
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> headers = new HashMap<String, String>();
String creds = String.format("%s:%s", RestClient.UserName, RestClient.Password);
String auth = "Basic " + Base64.encodeToString(creds.getBytes(), Base64.DEFAULT);
headers.put("Authorization", auth);
return headers;
}
@Override
protected Response<Long> parseNetworkResponse(NetworkResponse response) {
try {
String jsonString =
new String(response.data, HttpHeaderParser.parseCharset(response.headers));
return Response.success(Long.valueOf(jsonString),
HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
}
}
我调试了凌空代码,它在NetworkDispatcher
中停止//从队列中获取请求。
request = mQueue.take();
答案 0 :(得分:10)
这个问题很陈旧,但这没有任何回应。
我会尝试为其他人写一个响应有同样的问题,我相信这里的问题是你从主线程运行未来,并且默认用户执行响应这个线程。
Future在他的代码中等待,如果你从主线程运行它,你正在停止这个线程,并且响应处理程序线程永远不会执行它,对于这个问题,这仍然在等待。
答案 1 :(得分:1)
三件事:
future.get(30,TimeUnit.SECONDS);
希望它有所帮助!
答案 2 :(得分:0)
问题是你不要为你的get()使用超时。使用
future.get(20, TimeUnit.SECONDS);
并抓住错误。
(当然,不要在ui线程中使用它)