Android 如何防止截击请求重试?

Android 如何防止截击请求重试?,android,rest,http-post,android-volley,Android,Rest,Http Post,Android Volley,我将JsonRequest发布到服务器。服务器速度慢,而且Volley往往会多次调用速度慢的服务器,因为它没有从第一个请求得到响应(因为我的服务器速度慢)。有没有一种方法可以防止截击重新尝试一个请求,这样它就可以收到第一个响应 我试过: myRequest.setRetryPolicy(new DefaultRetryPolicy( TIMEOUT_MS, RETRIES, BACKOFF_MUL

我将JsonRequest发布到服务器。服务器速度慢,而且Volley往往会多次调用速度慢的服务器,因为它没有从第一个请求得到响应(因为我的服务器速度慢)。有没有一种方法可以防止截击重新尝试一个请求,这样它就可以收到第一个响应

我试过:

myRequest.setRetryPolicy(new DefaultRetryPolicy(
                TIMEOUT_MS, 
                RETRIES, 
                BACKOFF_MULT)); 
我用0替换了超时时间,用0替换了重试时间,也用0替换了回退时间,但它不起作用


有什么建议吗?

截取默认重试策略是:

/** The default socket timeout in milliseconds */
public static final int DEFAULT_TIMEOUT_MS = 2500;

/** The default number of retries */
public static final int DEFAULT_MAX_RETRIES = 1;

/** The default backoff multiplier */
public static final float DEFAULT_BACKOFF_MULT = 1f;
您可以在DefaultRetryPolicy.java中找到它

所以您可以看到,默认情况下,volley会发出一个重试请求

尝试使用较小的超时(如果您不想等待2500毫秒),或使用大于2500毫秒的超时来获得答案),但保留其他值,例如:

// Wait 20 seconds and don't retry more than once
myRequest.setRetryPolicy(new DefaultRetryPolicy(
       (int) TimeUnit.SECONDS.toMillis(20),
       DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
       DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
因此,要禁止截击重试,您需要执行以下操作:

myRequest.setRetryPolicy(new DefaultRetryPolicy(
       (int) TimeUnit.SECONDS.toMillis(20), //After the set time elapses the request will timeout
       0,
       DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
要停止重试请求,只需将请求的重试策略设置为
DefaultRetryPolicy
,其中
maxNumRetries
为0:

myRequest.setRetryPolicy(new DefaultRetryPolicy(
    DefaultRetryPolicy.DEFAULT_TIMEOUT_MS,
    0,  // maxNumRetries = 0 means no retry
    DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
试试这个

// remove caching
        jsObjRequest.setShouldCache(false);
        // Wait 30 seconds and don't retry more than once
        jsObjRequest.setRetryPolicy(new DefaultRetryPolicy(0, 0,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
方法调用表单任务

public void callWebService(JSONObject jsonRequest) {

    JsonObjectRequest jsObjRequest = new JsonObjectRequest(
            Request.Method.POST, url + pageurl, jsonRequest,
            new Response.Listener<JSONObject>() {

                @Override
                public void onResponse(JSONObject jsonObject) {
                    sendResponse(jsonObject);

                }
            }, new Response.ErrorListener() {

                @Override
                public void onErrorResponse(VolleyError error) {

                    callBack.onError(error);
                    try {
                        if (progressDialog != null) {
                            progressDialog.dismiss();
                            progressDialog = null;
                        }
                    } catch (Exception e) {
                        Helper.customPrintStackTrace(e);
                    }

                }
            }

    ) {

        @Override
        public String getBodyContentType() {
            return "application/json; charset=utf-8";
        }

        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {

            Map<String, String> params = new HashMap<String, String>();

            params.put(WebConfig.WebParams.APIKEY, Helper
                    .getStringValuefromPrefs(context,
                            SharedPreferencesKey.PREF_APIKEY));
            params.put(WebConfig.WebParams.APITOKEN, Helper
                    .getStringValuefromPrefs(context,
                            SharedPreferencesKey.PREF_APITOKEN));

            if (!Helper.getStringValuefromPrefs(context,
                    SharedPreferencesKey.PREF_USERID).equals("")) {

                params.put(WebConfig.WebParams.USER_ID, Helper
                        .getStringValuefromPrefs(context,
                                SharedPreferencesKey.PREF_USERID));

            } else {
                params.put(WebConfig.WebParams.USER_ID, "0");
            }

            return params;
        }

    };

    // remove caching
    jsObjRequest.setShouldCache(false);
    // Wait 30 seconds and don't retry more than once
    jsObjRequest.setRetryPolicy(new DefaultRetryPolicy(0, 0,
            DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
    // Access the RequestQueue through your singleton class.
    VolleySingleton.getInstance(context).addToRequestQueue(jsObjRequest);

    if (showDefultProcess) {

        progressDialog.show();
    }

}
public void callWebService(JSONObject jsonRequest){
JsonObjectRequest jsObjRequest=新的JsonObjectRequest(
Request.Method.POST、url+pageurl、jsonRequest、,
新的Response.Listener(){
@凌驾
公共void onResponse(JSONObject JSONObject){
sendResponse(jsonObject);
}
},new Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
callBack.onError(错误);
试一试{
如果(progressDialog!=null){
progressDialog.disclose();
progressDialog=null;
}
}捕获(例外e){
Helper.customPrintStackTrace(e);
}
}
}
) {
@凌驾
公共字符串getBodyContentType(){
返回“application/json;charset=utf-8”;
}
@凌驾
公共映射getHeaders()引发AuthFailureError{
Map params=新的HashMap();
参数put(WebConfig.WebParams.APIKEY,Helper
.getStringValuefromPrefs(上下文,
SharedPreferencesKey.PREF_APIKEY));
参数put(WebConfig.WebParams.APITOKEN,助手
.getStringValuefromPrefs(上下文,
SharedPreferencesKey.PREF_APITOKEN);
如果(!Helper.getStringValuefromPrefs(上下文,
SharedReferencesKey.PREF_USERID).equals(“”){
参数put(WebConfig.WebParams.USER_ID,Helper
.getStringValuefromPrefs(上下文,
SharedPreferencesKey.PREF_USERID));
}否则{
参数put(WebConfig.WebParams.USER_ID,“0”);
}
返回参数;
}
};
//删除缓存
jsObjRequest.setShouldCache(false);
//等待30秒,不要重试多次
jsObjRequest.setRetryPolicy(新的DefaultRetryPolicy(0,0,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
//通过singleton类访问RequestQueue。
getInstance(上下文).addToRequestQueue(jsObjRequest);
if(showDefultProcess){
progressDialog.show();
}
}

使用StringRequest对象或JsonObjectRequest对象或JsonArrayRequest对象调用此方法

例如,如果对象是StringRequest的实例,则方法如下:

stringRequest.setRetryPolicy(new DefaultRetryPolicy(initialTimeoutMs, maxNumRetries,
               backoffMultiplier ));
initialTimeoutMs策略的初始超时

maxNumRetries最大重试次数

退避乘数策略的退避乘数

下面是我给出的参数

stringRequest.setRetryPolicy(new DefaultRetryPolicy(10 * 1000, 0,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
第一个参数表示将InitialTimeout设置为10秒

第二个参数表示将重试次数设置为0


第三个参数是默认值。

如何为所有请求设置默认值\u MAX\u RETRIES=0?有可能吗?@BalaVishnu您不必更改默认值。您所要做的就是使用我上面的代码,并将第二个参数设置为0。哦,好的。谢谢,但我想知道是否可以对此进行任何全局设置,这样我们就不必在所有请求中反复给出这一行。@BalaVishnu Ha,所以打开
DefaultRetryPolicy
volley类,并将
DEFAULT\u MAX\u RETRIES
更改为0(默认值为1)myRequest.setRetryPolicy(新的DefaultRetryPolicy(2500,0,DefaultRetryPolicy.default_BACKOFF_MULT));根本不会重试吗?