web-dev-qa-db-ja.com

Android遅いリクエストがある場合のボレーダブルポスト

Volley POST低速ネットワークでのリクエストに問題があります。毎回BasicNetwork.logSlowRequests私のLogCatで、私のPOSTリクエストは2回以上実行され、1回のリクエストに対して複数(2回以上)の投稿が行われます。 。

これは私のLogCatです

03-16 01:31:35.674:D/Volley(5984):[19807] BasicNetwork.logSlowRequests:request = <[] http:// [myserver]/api/places 0xfa7d0c33のHTTPレスポンスNORMAL 1> [lifetime = 3824]、[size = 313]、[rc = 200]、[retryCount = 0] 03-16 01:31:35.704:D/Volley(5984):[1] Request.finish:3853 ms:[] http:// [myserver]/api/places 0xfa7d0c33 NORMAL 1

これは私のコードです

JSONObject body = new JSONObject();
try {
    body.put(PROTO_BODY_AUTHORIZATION, Sessions.getActiveSession().getToken());
} catch (JSONException e) {
    e.printStackTrace();
}

JsonObjectRequest request = new JsonObjectRequest(
        Request.Method.POST,
        context.getResources().getString(R.string.server_address) + "/places",
        body,
        callback,
        new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(context, error.getMessage(), Toast.LENGTH_LONG).show();
            }
        }
);

request.setRetryPolicy(
        new DefaultRetryPolicy(
                DefaultRetryPolicy.DEFAULT_TIMEOUT_MS,
                0,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
    getRequestQueue().add(request);

助けてください、私は必死にこの問題の解決策を見つけています。

57
aristo_sh

Requestオブジェクトに次の値を追加します。

request.setRetryPolicy(new DefaultRetryPolicy(
    DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2,
    DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
    DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

ここ: requestはJsonObjectRequestのオブジェクトです。 VolleyのDefaultRetryPolicyクラスのDEFAULT TIMEOUT VALUEに従って乗数の値を変更します。

以下のように、最初の引数を0に設定することもできます

request.setRetryPolicy(new DefaultRetryPolicy(
    0,
    DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
    DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
44
Droid_Mechanic

RetryPolicyのTimeoutを0に設定するだけでは不十分です。ソースをチェックした後、現在の<= max ...をチェックしているため、実際には再試行の最大数<0.

ポリシーを次のように設定して二重投稿を修正しました

new DefaultRetryPolicy(0, -1, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

それが役に立てば幸い!

15
user4173064

ダブルポストの解決策を見つけました。タイムアウトを0に設定しました。

9
aristo_sh

マルチポストバグの解決策を見つけました。

RetryPolicyを変更します。タイムアウト値を50000msに設定し、次のようにうまく動作しました:

  request.setRetryPolicy(
                new DefaultRetryPolicy(
                        500000,
                        DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                        DefaultRetryPolicy.DEFAULT_BACKOFF_MULT
                )
        );
4
xiaoyee

RetryPolicyを0再試行に設定し、タイムアウトがサーバータイムアウトよりも大きいことを確認する必要があります。

setRetryPolicy(new DefaultRetryPolicy("bigger than server timeout",
                                      0,
                                      DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
4
Alberto Penas

この問題は2つの方法で解決できます。

最初にRetryPolicyが変更されます。タイムアウト値をデフォルトのタイムアウトの2倍に設定するだけです。うまくいきました。他の値を試すこともできます。

_request.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
_

別の方法は、openConnectionメソッドHurlStackクラスにconnection.setChunkedStreamingMode(0);を設定することです。

このrequestQueue = Volley.newRequestQueue(context, new HurlStack());のようなRequestQueueを作成しています

それが役に立てば幸い :)

3
AB1209

これは私のために動作します。

public class MyRetryPolicyWithoutRetry implements RetryPolicy
{
    @override
    public int getCurrentTimeout()
    {
        return CONNECTION_TIME_OUT; /200000/
    }

    @Override
    public int getCurrentRetryCount()
    {
        return 0;
    }

    @Override
    public void retry(VolleyError error) throws VolleyError
    {
        throw(error);
    }
}

使用するには:

request.setRetryPolicy(new MyRetryPolicyWithoutRetry());
2
Vitali Pekelis

setRetryPolicyの時間を増やしてください。

request.setRetryPolicy(new DefaultRetryPolicy(
                    30000,
                    DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                    DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
            Volley.newRequestQueue(this).add(equest);
2
Jatin Devani

ここで同様の質問をしました:

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

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

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

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

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

この post は、解決策を見つけるのに役立ちました。

2
user921509

このようにHttpURLConnectionを構成することで、これを修正できました。

connection.setChunkedStreamingMode(0);

これについては、ボレーのメーリングリストで議論を始めました( https://groups.google.com/forum/#!topic/volley-users/8PE9dBbD6iA )。

1
pmellaaho

これを使用して問題を解決できます。

StringRequest.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
1
RahulSonkhiya

ダブルリクエストを停止する唯一の方法は、再試行ポリシーの再試行を-1に設定することでした

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

HasAttemptRemaining()メソッドでretryCountが0でMax retriesも0の場合、残りの試行に対するDefaultRetryPolicyのロジックがtrueを返すためだと思います。

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

ちょうどmaxNumRetries = 0仕事なし。 set TIMEOUT_MS 20000

request.setRetryPolicy(new DefaultRetryPolicy(20000, 0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
0
ayyb1988

Android date残念ながらテスト目的で私の問題を修正しました。Android日付を変更し、SSLセキュリティエラーを取得しました。

0
Nouman Ch
request.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

これは私のために働いた。

0
Ahsanwarsi

多くのことを試してみましたが、結局何も助けませんでした。最後に、次の変更の組み合わせを見つけました。

sr.setRetryPolicy(new DefaultRetryPolicy(0,-1, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

そして、アプリケーションクラスのhurl接続で、これを追加します。

httpsURLConnection.setChunkedStreamingMode(0);

これはスムーズに機能し、Volleyがサーバーで複数のリクエストをヒットするのを防ぎました。

0
Artist404