JsonRequestをサーバーに投稿します。サーバーが遅い。 Volleyは、最初の要求から応答を受け取らなかったため、低速サーバーに対して複数の呼び出しを行う傾向があります(私のサーバーは低速であるため)。 Volleyが最初の応答を受信できるように、要求を再試行することを無効にする方法はありますか?
私が試してみました:
myRequest.setRetryPolicy(new DefaultRetryPolicy(
TIMEOUT_MS,
RETRIES,
BACKOFF_MULT));
TIMEOUT_MS = 0、RETRIES = 0、BACKOFF_MULT = 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にあります。
したがって、ボレーはデフォルトで1回の再試行要求を行うことがわかります。
より小さいタイムアウト(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));
したがって、Volleyの再試行を無効にするには、次を実行する必要があります。
myRequest.setRetryPolicy(new DefaultRetryPolicy(
(int) TimeUnit.SECONDS.toMillis(20), //After the set time elapses the request will timeout
0,
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();
}
}
Volley によるリクエストの再試行を停止するには、リクエストの再試行ポリシーをDefaultRetryPolicy
に設定し、maxNumRetries
を0にします。
myRequest.setRetryPolicy(new DefaultRetryPolicy(
DefaultRetryPolicy.DEFAULT_TIMEOUT_MS,
0, // maxNumRetries = 0 means no retry
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
StringRequest ObjectまたはJsonObjectRequest ObjectまたはJsonArrayRequest Objectを使用して、このメソッドを呼び出します。
たとえば、オブジェクトがStringRequestのインスタンスである場合、メソッドは次のとおりです。
stringRequest.setRetryPolicy(new DefaultRetryPolicy(initialTimeoutMs, maxNumRetries,
backoffMultiplier ));
initialTimeoutMsポリシーの初期タイムアウト。
maxNumRetries再試行の最大回数。
backoffMultiplierポリシーのバックオフ乗数。
以下は、私が与えたパラメーターです。
stringRequest.setRetryPolicy(new DefaultRetryPolicy(10 * 1000, 0,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
最初のパラメーターは、InitialTimeoutを10秒に設定します。
2番目のパラメーターは、再試行回数の設定が0に試行されることを示します。
3番目のパラメーターはデフォルトです。