質問

私の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)
                );
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top