我在我的项目中使用Android Volley lib来执行网络请求,所有工作都很顺利但是我对这个lib的“取消”功能有一些麻烦。我解释了我的问题..
我有一个活动,我在OnCreate
方法执行请求,请求被调用,没问题。但是为了确保cancel
方法有效,我想测试并尝试两件事:
我解雇了我的请求,就在这样取消之后:
MySingleton.getMyData("urltocall", getDataListener, requestTag);
MySingleton.getRequestQueue().cancelAll(requestTag);
这个有效!取消被调用(我也可以在Volley的Request类中看到它):
public void cancel() {
mCanceled = true; // my breakpoint is called here
}
我触发了我的请求,刚刚调用了我的活动的finish()方法,并且在活动的onDestroy
和/或onStop
方法中,我正在调用相同的代码:< / p>
MySingleton.getMyData("urltocall", getDataListener, requestTag);
MySingleton.getRequestQueue().cancelAll(requestTag);
但不起作用!
requestTag不是null并且很好地传递给了Volley,所以我无法理解为什么第一种方法有效而不是另一种方法......知道我的目的是在调用onDestroy
时取消请求。
感谢您的帮助
答案 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