Android - 取消Volley请求

时间:2015-03-14 16:13:19

标签: android request android-volley

我在我的项目中使用Android Volley lib来执行网络请求,所有工作都很顺利但是我对这个lib的“取消”功能有一些麻烦。我解释了我的问题..

我有一个活动,我在OnCreate方法执行请求,请求被调用,没问题。但是为了确保cancel方法有效,我想测试并尝试两件事:

  1. 我解雇了我的请求,就在这样取消之后:

    MySingleton.getMyData("urltocall", getDataListener, requestTag); MySingleton.getRequestQueue().cancelAll(requestTag);

  2. 这个有效!取消被调用(我也可以在Volley的Request类中看到它):

    public void cancel() {
            mCanceled = true; // my breakpoint is called here
        }
    
    1. 我触发了我的请求,刚刚调用了我的活动的finish()方法,并且在活动的onDestroy和/或onStop方法中,我正在调用相同的代码:< / p>

      MySingleton.getMyData("urltocall", getDataListener, requestTag); MySingleton.getRequestQueue().cancelAll(requestTag);

    2. 不起作用

      requestTag不是null并且很好地传递给了Volley,所以我无法理解为什么第一种方法有效而不是另一种方法......知道我的目的是在调用onDestroy时取消请求。

      感谢您的帮助

4 个答案:

答案 0 :(得分:14)

我的猜测是,在第一种情况下,请求只添加到RequestQueue,这就是调用cancelAll()的原因。在第二种情况下,启动请求和暂停/销毁Activity之间有一点延迟:在该延迟中,HTTP请求已经开始。您可能不知道调用cancelAll()仅适用于仍在RequestQueue中的请求。它不适用于已经开始的HTTP请求,没有办法阻止它。

话虽如此,文档here意味着一旦请求被取消(即通过调用cancel()),就可以有效地将其视为从未在第一时间调用Web服务。不会调用与特定请求关联的回调(尽管收到的响应可能会保留在本地缓存中)。

答案 1 :(得分:7)

https://developer.android.com/training/volley/simple.html#cancel

这基本上就是说

  

一旦取消,Volley保证永远不会调用您的响应处理程序。

所以即使没有办法撤消/取消已经开始的http请求(这是有意义的),也不会调用与请求相关的回调,这对我来说实际上意味着我可以对待已取消的请求在大多数情况下,即使静默接收的响应可能在缓存中可用。

答案 2 :(得分:6)

您可以取消附加到Request的{​​{1}}。所以基本上你必须为每个TAG添加一个标记。

Request

yourRequestObject.setTag(TAG);

RequestQueue mRequestQueue;

这样您就可以取消具有特定mRequestQueue.cancelAll(TAG);的所有Request

答案 3 :(得分:2)

我建议您在onPause()方法中取消添加的请求。考虑:

  

onPause()系统将此方法作为第一个指示   用户离开你的活动(虽然它并不总是意味着   活动正在被破坏)。这通常是您应该提交的地方   应保留在当前用户会话之外的任何更改   (因为用户可能不会回来)。来源:Android Developers