我在我的项目中使用Android Volley lib来执行网络请求,一切都很好,但我对这个lib的“取消”功能有一些问题。我解释了我的问题…
我有一个活动,我在OnCreate
方法执行请求,请求被调用,没问题。但为了确保取消
方法有效,我想测试并尝试2件事:
>
我触发我的请求,然后像这样取消它:
MySingleton. getMyData("urltocall",getDataListener,request estTag);
MySingleton.getRequest estQueue().取消所有(request estTag);
这个有效!取消被调用(我也可以在Volley的Request类中看到它):
public void cancel() {
mCanceled = true; // my breakpoint is called here
}
我触发我的请求,就在调用我的活动的完成()方法之后,在活动的onDestroy
和/或onStop
方法中,我调用相同的代码:
MySingleton. getMyData("urltocall",getDataListener,request estTag);
MySingleton.getRequest estQueue().取消所有(request estTag);
但这行不通!
request estTag不是null并且很好地传递给了Volley,所以我不明白为什么第一个方法有效而另一个方法无效…知道我的目的是在调用onDestroy
时取消请求…
谢谢你的帮忙
我的猜测是,在第一种情况下,请求只被添加到Request estQueue
中,这就是为什么调用取消全部()
有效。在第二种情况下,启动请求和暂停/销毁Activity
之间有一个轻微的延迟:在那个延迟中,HTTP请求已经开始。您可能没有意识到,调用取消全部()
仅适用于那些仍在Request estQueue
中的请求。它不适用于已经开始的HTTP请求,没有办法阻止它。
话虽如此,这里的留档意味着一旦请求被取消(即通过调用取消()
),它可以被有效地视为从未调用过Web服务。与特定请求相关的回调不会被调用(尽管收到的响应可能保存在本地缓存中)。
您可以取消附加到TAG
的Request
。所以基本上你必须在每个Request
中添加一个标签。
您的请求对象。设置标签(TAG);
Request estQueue mRequest estQueue;
m请求队列。全部取消(TAG);
这样您就可以使用特定的TAG
取消所有Request
。
https://developer.android.com/training/volley/simple.html#cancel
这基本上是说
取消后,Volley保证永远不会调用您的响应处理程序。
因此,即使没有办法撤消/取消已经开始的超文本传输协议请求(这是有道理的),也不会调用与请求关联的回调,这对我来说实际上意味着我可以在大多数情况下处理已取消的请求,即使这样收到的响应可能在缓存中可用。