安卓Volley发送数据两次

57

我在我的应用程序中使用Volley网络库。

问题是当网络连接缓慢时,它会发送多次数据。

在我通过谷歌搜索了解这个问题后,我发现以下内容:

connection.setChunkedStreamingMode(0);

但是我无法编辑我的Volley库Hurlkstack类。

它说:

该类文件的JAR属于Android私有库容器,不允许对其条目上的源附件进行修改。

我该怎么办?有人可以帮帮我吗?

以下是我的代码,我应该在哪里进行修改。

private void makeJsonObjectRequest() {
    JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.POST,
            "http://example.com/***.php", obj, new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    try {
                        response.getString("success");
                        } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                }
            });

    AppController.getInstance().addToRequestQueue(jsonObjReq);
}

看看这个能否帮到你:https://dev59.com/NWIj5IYBdhLWcg3wpmsH - Rohit5k2
1
你可以分享一下你如何发布数据吗?因为我只看到了用 JsonObjectRequest 检索数据的代码。你可以为它设置重试策略:jsonObjReq.setRetryPolicy(new DefaultRetryPolicy( 0, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); - Piyush
@PiyushGupta,我已经得到了答案,如果它不能满足我的需求,那么我会发布更多信息。谢谢您的回复。 - Shashikala Chavan
@ShashikalaChavan 好的,没问题。 - Piyush
DefaultRetryPolicy.DEFAULT_MAX_RETRIES = 0 在我的设备上也不起作用。 - Sonali Kale
5个回答

107

不需要使用 connection.setChunkedStreamingMode(0); 来避免 volley发送数据两次 的bug。你需要为当前请求设置重试策略:

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

4
AppController.getInstance().addToRequestQueue(jsonObjReq);行之前调用setRetryPolicy方法。 - ρяσѕρєя K
1
这个解决方案可能会导致java.lang.NegativeArraySizeException吗?这是我在使用setRetryPolicy后遇到的问题(链接)。 - Orcun Sevsay
如果我们将请求超时设置为零,那么当请求超时时会发生什么? - sunil kushwah
3
为避免重复发送,请将maxNumRetries设置为0。(DEFAULT_MAX_RETRIES = 1,因此它会重试一次并发送两次消息) - Lolo
感谢您的解决方案,但奇怪的是,对我来说只有 new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS, 0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT) 这个方法可行!我在一个Samsung-XCover Android 8.1.0 SDK-27设备上运行了测试。 - iOS-Coder
显示剩余6条评论

7
完成Volley解析后,在new Response.ErrorListener()方法中使用以下代码。希望这对你有用。我曾经遇到过相同的问题,使用相同的代码解决了它。
代码:
jsObjRequest.setRetryPolicy(new DefaultRetryPolicy(
                30000,
                DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

3

这会起作用

 RetryPolicy mRetryPolicy = new DefaultRetryPolicy(
 0,
 DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
 DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);

 request.setRetryPolicy(mRetryPolicy);

3

试一下,这肯定有效。

 public <T> void addToRequestQueue(StringRequest req, String tag) {
    req.setTag(TextUtils.isEmpty(tag) ? TAG : tag);
    req.setRetryPolicy(new DefaultRetryPolicy(20 * 1000, 0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

    getRequestQueue().add(req);
}

1
我使用以下代码解决了这个问题。将getCurrentRetryCount()设置为返回0,并使用HurlStack作为BaseHttpStack。
RequestQueue requestQueue = Volley.newRequestQueue(NavigationActivity.this, new HurlStack());
    requestQueue.add(stringRequest).setRetryPolicy(new RetryPolicy() {
        @Override
        public int getCurrentTimeout() {
            return 5000;
        }

        @Override
        public int getCurrentRetryCount() {
            return 0; //retry turn off
        }

        @Override
        public void retry(VolleyError error) throws VolleyError {

        }
    });

希望这能解决问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接