web-dev-qa-db-ja.com

Android再試行ポリシーが0に設定されている場合、Volleyはサーバーに2つのリクエストを送信します

非同期リクエストとイメージキャッシングにVolleyを使用するAndroidプロジェクトに取り組んでいます。再試行ポリシーを0に設定している場合でも、どういうわけかリクエストがサーバーに2回ヒットしています。値をオーバーライドしてみましたDefaultRetryPolicyオブジェクトから成功しませんでした。サンプルコードを次に示します。

リクエスト:

@Override
public void gravarVendaMobile(final Usuario usuarioAutenticado, final AsyncCallback<String> callback) {
    obterParametrosDeInicializacao().done(new DoneCallback<ParametrosDeInicializacao>() {
        @Override
        public void onDone(final ParametrosDeInicializacao param) {
            requestQueue.add(setDefaultRetryPolicy(new StringRequest(
                    Method.POST,
                    urlPara(GRAVAR_VENDA_MOBILE, usuarioAutenticado.getFilial(), usuarioAutenticado.getCodigo()),
                    listener(callback),
                    //errorListener(R.string.could_not_load_produtos, callback)
                    new ErrorListener() {
                        @Override
                        public void onErrorResponse(VolleyError error) {
                            callback.onError(new MessageCodeException(error.networkResponse.statusCode, error));
                        }
                    }
            ) {

                @Override
                public Map<String, String> getHeaders() throws AuthFailureError {
                    Map<String, String> headers = new HashMap<String, String>();
                    headers.put("Encoding", "UTF-8");
                    headers.put("Accept", "application/json");
                    headers.put("Content-type", "application/json; charset=UTF-8");
                    return headers;
                }


            }));
        }
    });
}

再試行ポリシー:

private Request<?> setDefaultRetryPolicy(Request<?> request) {
    request.setRetryPolicy(new DefaultRetryPolicy(30000, 0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

    return request;
}

基本的に、タイムアウトを30秒に設定し、再試行は0回にします。

再試行回数を増やすと期待どおりに機能しますが、0に設定すると2回のリクエストが行われます。

ここで助けが必要です。

編集

Android内でkeep-aliveプロパティをfalseに設定することで、問題を解決することができました。例えば:

System.setProperty("http.keepAlive", "false");

このコード行を、requestqueueをインポートしてリクエストを行うクラス内に追加しました。

また、サーバーにキープアライブヘッダーがあるかどうかを確認してください。

これ post は解決策にたどり着くのに役立ちました。

DefaultRetryPolicy.classのhasAttemptRemaining()クラスは次のようになります。

protected boolean hasAttemptRemaining() {
    return this.mCurrentRetryCount <= this.mMaxNumRetries;
}

私が見ることができることから、maxNumRetriesを0に設定しても、まだ再試行を行っていない場合でも、その戻り値はtrueになります。

私はそれを修正しました

request.setRetryPolicy(new DefaultRetryPolicy(0, -1, 0);
2
Amoliski

これを使用して、繰り返しなしのポリシーを設定します。

    myRequest.setRetryPolicy(new DefaultRetryPolicy(0,
            DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
1
Luca Nicoletti

必要に応じてタイムアウトを20秒以上に設定し、0に再試行するだけです

req.setRetryPolicy(new DefaultRetryPolicy(20 * 1000, 0,
  DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
0