Android - 取消Volley请求

eja*_*jay 14 android request android-volley

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

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

  1. 我解雇了我的请求,就像取消它之后:

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

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

public void cancel() {
        mCanceled = true; // my breakpoint is called here
    }
Run Code Online (Sandbox Code Playgroud)
  1. 我激活了我的请求,在调用了我的活动的finish()方法和活动的方法onDestroy和/或onStop方法后,我正在调用相同的代码:

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

但这不起作用!

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

谢谢你的帮助

Y.S*_*Y.S 17

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

话虽如此,这里的文档暗示一旦请求被取消(即通过调用cancel()),它可以被有效地视为Web服务从未被调用过.不会调用与特定请求相关联的回调(尽管收到的响应可能会保留在本地缓存中).

  • 是的,由于显而易见的原因(一旦开始就必须完成网络呼叫),它无法取消已经开始*的请求.只有那些仍在"RequestQueue"中的请求才能被停止,因为它们还没有开始.我希望你能理解这一点. (2认同)

mit*_*ril 7

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

这基本上就是说

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

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


小智 6

你可以取消Request附加到TAG.所以基本上你必须为每个添加一个标签Request.

yourRequestObject.setTag(TAG);

RequestQueue mRequestQueue;

mRequestQueue.cancelAll(TAG);

这样你可以取消所有Request特定的TAG.