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);
助けてください、私は必死にこの問題の解決策を見つけています。
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));
RetryPolicyのTimeoutを0に設定するだけでは不十分です。ソースをチェックした後、現在の<= max ...をチェックしているため、実際には再試行の最大数<0.
ポリシーを次のように設定して二重投稿を修正しました
new DefaultRetryPolicy(0, -1, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
それが役に立てば幸い!
ダブルポストの解決策を見つけました。タイムアウトを0に設定しました。
マルチポストバグの解決策を見つけました。
RetryPolicyを変更します。タイムアウト値を50000msに設定し、次のようにうまく動作しました:
request.setRetryPolicy(
new DefaultRetryPolicy(
500000,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT
)
);
RetryPolicyを0再試行に設定し、タイムアウトがサーバータイムアウトよりも大きいことを確認する必要があります。
setRetryPolicy(new DefaultRetryPolicy("bigger than server timeout",
0,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
この問題は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
を作成しています
それが役に立てば幸い :)
これは私のために動作します。
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());
setRetryPolicyの時間を増やしてください。
request.setRetryPolicy(new DefaultRetryPolicy(
30000,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
Volley.newRequestQueue(this).add(equest);
ここで同様の質問をしました:
再試行ポリシーが0に設定されている場合、Android Volleyはサーバーに対して2つのリクエストを行います
Android内でkeep-aliveプロパティをfalseに設定することで、この問題を解決できました。例:
System.setProperty("http.keepAlive", "false")
Requestqueueをインポートしてリクエストを行うクラス内にこのコード行を追加しました。
また、サーバーにキープアライブヘッダーがあるかどうかを確認します。
この post は、解決策を見つけるのに役立ちました。
このようにHttpURLConnectionを構成することで、これを修正できました。
connection.setChunkedStreamingMode(0);
これについては、ボレーのメーリングリストで議論を始めました( https://groups.google.com/forum/#!topic/volley-users/8PE9dBbD6iA )。
これを使用して問題を解決できます。
StringRequest.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
ダブルリクエストを停止する唯一の方法は、再試行ポリシーの再試行を-1に設定することでした
request.setRetryPolicy(new DefaultRetryPolicy(0, -1, 0));
HasAttemptRemaining()メソッドでretryCountが0でMax retriesも0の場合、残りの試行に対するDefaultRetryPolicyのロジックがtrueを返すためだと思います。
protected boolean hasAttemptRemaining() {
return this.mCurrentRetryCount <= this.mMaxNumRetries;
}
ちょうどmaxNumRetries = 0
仕事なし。 set TIMEOUT_MS 20000
。
request.setRetryPolicy(new DefaultRetryPolicy(20000, 0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
Android date
残念ながらテスト目的で私の問題を修正しました。Android日付を変更し、SSLセキュリティエラーを取得しました。
request.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
これは私のために働いた。
多くのことを試してみましたが、結局何も助けませんでした。最後に、次の変更の組み合わせを見つけました。
sr.setRetryPolicy(new DefaultRetryPolicy(0,-1, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
そして、アプリケーションクラスのhurl接続で、これを追加します。
httpsURLConnection.setChunkedStreamingMode(0);
これはスムーズに機能し、Volleyがサーバーで複数のリクエストをヒットするのを防ぎました。