Android凌空通过图片上传发送两次信息

时间:2013-11-15 21:39:37

标签: php android android-volley

我正在尝试将带有我的发布数据的图像从android发送到我的服务器。为了实现这一点,我将64位编码的我的图像编码为字符串并使用android volley库发送它。但这会引起问题。由于某种原因,它有时会发送两次帖子,我无法弄清楚原因。下面是调用发送post请求的函数。我在String url = "http://domain.com/ajax_ws.php";处设置了一个符号,然后在protected Map<String, String> getParams() {处设置了一个符号我发现String url = ...仅被调用一次但是当它发送两个时,protected Map...是叫了两次。我在android排球上找不到任何文档,所以我不知道为什么会这样。调整位图大小,使图像字符串始终保持在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);
}

知道为什么会这样吗?

6 个答案:

答案 0 :(得分:8)

我能够通过两种方式解决这个问题。

首先由 Snicolas 建议。更改了RetryPolicy。 只需将超时值设置为默认超时的两倍即可。工作得很好。您也可以尝试其他值。

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());

希望有所帮助:)

答案 1 :(得分:6)

解决方案是编辑重试政策,此处也会说明:(http://www.techstricks.com/avoid-multiple-requests-when-using-volley/)。

但是,如果覆盖对您不起作用,那么您可能希望重新访问您的凌空缓存逻辑。由于凌空缓存中的软ttl,结果从缓存中传递,同时它将另一个网络请求排队,该请求也将返回结果。因此,单个请求,但两个不同的结果。

答案 2 :(得分:4)

Volley使用RetryPolicy处理请求,默认情况下,使用指数退避算法将请求最多发送3次。可能是某些请求失败并重试?您是否收到第一次请求的错误/成功日志?

答案 3 :(得分:3)

以下修复对我有用。那些使用HTTPS和凌空的人应该试试这个。

DefaultRetryPolicy  retryPolicy = new DefaultRetryPolicy(0, -1, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
        jsr.setRetryPolicy(retryPolicy);

希望这可以帮助您解决问题。

答案 4 :(得分:1)

试试这个。

JsonObjectRequest jsonObjRequest = new JsonObjectRequest(...);
jsonObjRequest.setRetryPolicy(new DefaultRetryPolicy(0, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

答案 5 :(得分:1)

将重试次数编辑为1.它对我有效。

stringRequest.setRetryPolicy(new
          DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2, 1, 
                           DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)
                );