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