凌空同步请求永远阻止

时间:2014-01-19 22:11:42

标签: android android-volley

我想使用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();

3 个答案:

答案 0 :(得分:10)

这个问题很陈旧,但这没有任何回应。

我会尝试为其他人写一个响应有同样的问题,我相信这里的问题是你从主线程运行未来,并且默认用户执行响应这个线程。

Future在他的代码中等待,如果你从主线程运行它,你正在停止这个线程,并且响应处理程序线程永远不会执行它,对于这个问题,这仍然在等待。

答案 1 :(得分:1)

三件事:

  1. 使用带有超时的future.get()方法,如下所示:
  2.   

    future.get(30,TimeUnit.SECONDS);

    1. 在将请求添加到队列之前,请确保您没有调用future.get()。
    2. 它不会在主线程上运行。请尝试使用它。我没有看到你在主线上需要它的原因。
    3. 希望它有所帮助!

答案 2 :(得分:0)

问题是你不要为你的get()使用超时。使用

future.get(20, TimeUnit.SECONDS);

并抓住错误。

(当然,不要在ui线程中使用它)