我正在尝试将带有我的发布数据的图像从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);
}
知道为什么会这样吗?
答案 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)
);