Android Volleyはイメージアップロードで情報を2回送信しています
-
20-12-2019 - |
質問
私のPOSTデータをAndroidからサーバーに送信しようとしています。このiベース64を達成するために、私のイメージを文字列に符号化し、それをAndroid Volleyライブラリを使用して送信しました。これは問題を引き起こしています。何らかの理由でそれは時々投稿を2回送信し、なぜ私は理由を理解することができません。以下は、投稿要求を送信するために呼び出される関数です。私はString url = "http://domain.com/ajax_ws.php";
にブレークマークを付けてから、私が見つけたのはprotected Map<String, String> getParams() {
の1つが1回呼び出されますが、2つを送信すると、String url = ...
が2回呼び出されます。Android Volleyに関する文書は見つかりませんので、なぜが起こっているのかわかりません。ビットマップは、画像文字列が100kから200k文字の間のどこかで一貫してサイズ変更されます。私は多分それがサイズの問題だと思いましたが、私のサーバーはイメージを受け取り、それらを復号していて、すべて大丈夫です。
public void Sharing() {
pd = ProgressDialog.show(getParent(), null, "Please Wait...");
final String caption = mEtMessage.getText().toString();
RequestQueue queue = Volley.newRequestQueue(this);
String url = "http://domain.com/ajax_ws.php";
StringRequest postRequest = new StringRequest(
Request.Method.POST,
url,
new MyStringListener(),
new MyErrorListener()
) {
@Override
protected Map<String, String> getParams() {
Map<String, String> params = new HashMap<String, String>();
params.put("token", "secretToken");
params.put("mode", "createVoucher");
params.put("user_id", ActivityLogin.id);
params.put("deal_id", ActivitySharing.id_deal);
params.put("user_id_company", ActivityRestaurantDetails.res.getId());
params.put("user_img", pathImage);
params.put("caption", caption);
params.put("company_id", ActivityRestaurantDetails.res.getId());
return params;
}
};
queue.add(postRequest);
}
.
これが起こっているかもしれない理由は何ですか?
解決
Valleyは、デフォルトで要求を要求側バックオフアルゴリズムで最大3回まで送信する要求を処理するためにRetryPolicyを使用します。いくつかの要求が失敗して再試行されることはできますか?リクエストの最初の呼び出しのためのエラー/サクセスログがありますか?
他のヒント
私はこの問題を2つの方法で解決することができます。
最初は Snicolas によって提案されています。RetryPolicy
を変更しました。
タイムアウト値をデフォルトのタイムアウトの2倍に設定するだけです。うまくいった。他の値を試すこともできます。
request.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
.
別の方法は、connection.setChunkedStreamingMode(0);
メソッドopenConnection
クラスでHurlStack
を設定することです。
このRequestQueue
requestQueue = Volley.newRequestQueue(context, new HurlStack());
を作成しています
それが助けることを願っています:)
解像度はここで説明されている再試行ポリシーを編集することです。(href="http://www.techstricks.com/avoid-multiple-requests-when-using-volley/"> http:// www.techStricks.com / virce-multiple-requests-when-using-volley / )
しかし、上書きがあなたのために機能しないならば、あなたはあなたのバレーキャッシングロジックを再検討することを好むかもしれません。バレーのキャッシングのソフトTTLのために、結果はキャッシュから配信され、その結果も返す別のネットワーク要求をキューに入れます。したがって、単一の要求が2つの異なる結果。
下記の修正は私のために働いた。HTTPSとVolleyで働く人々はこれを試すべきです。
DefaultRetryPolicy retryPolicy = new DefaultRetryPolicy(0, -1, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
jsr.setRetryPolicy(retryPolicy);
.
これがあなたが問題を解決するのを助けることを願っています。
これを試してください。
JsonObjectRequest jsonObjRequest = new JsonObjectRequest(...);
jsonObjRequest.setRetryPolicy(new DefaultRetryPolicy(0, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
. 再試行番号を1に編集します。
stringRequest.setRetryPolicy(new
DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2, 1,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)
);
.