Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

volley synchronous request blocks forever

I want to make synchronous request using volley library and I used the following code :

RequestFuture<Long> future = RequestFuture.newFuture();

        AuthenticatedJsonRequest request = new AuthenticatedJsonRequest(Method.GET,ServiceUrl,null,future,future);
        requestQueue.add(request);

        try {

            Long response = future.get();

but the code is blocking forever here :

Long response = future.get();

and this is my custom 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));
            }
    }

I debugged volley code and it is stopping in NetworkDispatcher

// Take a request from the queue.

   request = mQueue.take();
like image 330
Mohammed Subhi Sheikh Quroush Avatar asked Jan 19 '14 22:01

Mohammed Subhi Sheikh Quroush


1 Answers

This question is old, but this doesn't have any response.

I will try write a response for other people have the same problem, I believe that the problem here is that you are running the future from the main thread, and volley user this thread by default for execute the responses.

Future makes a wait in his code, if you run it from main thread you are stopping this thread, and the response handler thread never execute it, an for this problem this is still waiting forever.

like image 63
flipper83 Avatar answered Sep 21 '22 12:09

flipper83