Change Volley timeout duration

前端 未结 9 618
梦如初夏
梦如初夏 2020-11-22 14:55

I use the new Volley framework for Android to do a request to my server. But it timeouts before getting the response, although it does respond.

I tried adding this

相关标签:
9条回答
  • 2020-11-22 15:19

    See Request.setRetryPolicy() and the constructor for DefaultRetryPolicy, e.g.

    JsonObjectRequest myRequest = new JsonObjectRequest(Method.GET,
            url, null,
            new Response.Listener<JSONObject>() {
    
                @Override
                public void onResponse(JSONObject response) {
                    Log.d(TAG, response.toString());
                }
            }, new Response.ErrorListener() {
    
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.d(TAG, "Error: " + error.getMessage());
                }
    });
    
    myRequest.setRetryPolicy(new DefaultRetryPolicy(
            MY_SOCKET_TIMEOUT_MS, 
            DefaultRetryPolicy.DEFAULT_MAX_RETRIES, 
            DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
    
    0 讨论(0)
  • 2020-11-22 15:19

    Just to contribute with my approach. As already answered, RetryPolicy is the way to go. But if you need a policy different the than default for all your requests, you can set it in a base Request class, so you don't need to set the policy for all the instances of your requests.

    Something like this:

    public class BaseRequest<T> extends Request<T> {
    
        public BaseRequest(int method, String url, Response.ErrorListener listener) {
            super(method, url, listener);
            setRetryPolicy(getMyOwnDefaultRetryPolicy());
        }
    }
    

    In my case I have a GsonRequest which extends from this BaseRequest, so I don't run the risk of forgetting to set the policy for an specific request and you can still override it if some specific request requires to.

    0 讨论(0)
  • 2020-11-22 15:19

    I ended up adding a method setCurrentTimeout(int timeout) to the RetryPolicy and it's implementation in DefaultRetryPolicy.

    Then I added a setCurrentTimeout(int timeout) in the Request class and called it .

    This seems to do the job.

    Sorry for my laziness by the way and hooray for open source.

    0 讨论(0)
  • 2020-11-22 15:23
    req.setRetryPolicy(new DefaultRetryPolicy(
        MY_SOCKET_TIMEOUT_MS, 
        DefaultRetryPolicy.DEFAULT_MAX_RETRIES, 
        DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
    

    You can set MY_SOCKET_TIMEOUT_MS as 100. Whatever you want to set this to is in milliseconds. DEFAULT_MAX_RETRIES can be 0 default is 1.

    0 讨论(0)
  • 2020-11-22 15:26

    Alternative solution if all above solutions are not working for you

    By default, Volley set timeout equally for both setConnectionTimeout() and setReadTimeout() with the value from RetryPolicy. In my case, Volley throws timeout exception for large data chunk see:

    com.android.volley.toolbox.HurlStack.openConnection(). 
    

    My solution is create a class which extends HttpStack with my own setReadTimeout() policy. Then use it when creates RequestQueue as follow:

    Volley.newRequestQueue(mContext.getApplicationContext(), new MyHurlStack())
    
    0 讨论(0)
  • 2020-11-22 15:28

    Another way of doing it is in custom JsonObjectRequest by:

    @Override
    public RetryPolicy getRetryPolicy() {
        // here you can write a custom retry policy and return it
        return super.getRetryPolicy();
    }
    

    Source: Android Volley Example

    0 讨论(0)
提交回复
热议问题