Блоки блокировки волейбола навсегда

Я хочу сделать синхронный запрос с помощью библиотеки 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(); 

Этот вопрос старый, но ответа на него нет.

Я попробую написать ответ для других людей, имеющих ту же проблему, я считаю, что проблема здесь в том, что вы используете будущее из основного потока, а волейбол – этот поток по умолчанию для выполнения ответов.

Будущее заставляет ждать в коде, если вы запустите его из основного потока, вы остановите этот поток, и поток обработчика ответа никогда не выполнит его, для этой проблемы это все еще ждет навсегда.

Три вещи:

  1. Используйте метод future.get () с таймаутами, например:

Future.get (30, TimeUnit.SECONDS);

  1. Убедитесь, что вы не вызываете future.get () перед добавлением запроса в очередь.
  2. Это не будет работать в основной теме. Попробуйте это вместо этого. Я не вижу причины, по которой вам это нужно в главной теме.

Надеюсь, поможет!

Проблема в том, что вы не используете тайм-аут для своего get (). использование

 future.get(20, TimeUnit.SECONDS); 

И поймать ошибку.

(И, конечно, не используйте его в ui-нитке)