web-dev-qa-db-ja.com

Volleyリクエストの再試行を無効にする方法

JsonRequestをサーバーに投稿します。サーバーが遅い。 Volleyは、最初の要求から応答を受け取らなかったため、低速サーバーに対して複数の呼び出しを行う傾向があります(私のサーバーは低速であるため)。 Volleyが最初の応答を受信できるように、要求を再試行することを無効にする方法はありますか?

私が試してみました:

myRequest.setRetryPolicy(new DefaultRetryPolicy(
                TIMEOUT_MS, 
                RETRIES, 
                BACKOFF_MULT)); 

TIMEOUT_MS = 0、RETRIES = 0、BACKOFF_MULT = 0に置き換えましたが、機能しません。

他の提案はありますか?

28
xiaowoo

ボレーのデフォルトの再試行ポリシーは次のとおりです。

/** 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));
43
David

これを試して、

// 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();
    }

}
5
Dwivedi Ji

Volley によるリクエストの再試行を停止するには、リクエストの再試行ポリシーをDefaultRetryPolicyに設定し、maxNumRetriesを0にします。

myRequest.setRetryPolicy(new DefaultRetryPolicy(
    DefaultRetryPolicy.DEFAULT_TIMEOUT_MS,
    0,  // maxNumRetries = 0 means no retry
    DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
4
Pang

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番目のパラメーターはデフォルトです。

1
mehmoodnisar125