提问者:小点点

Android-取消凌空请求


我在我的项目中使用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时取消请求…

    谢谢你的帮忙


  • 共3个答案

    匿名用户

    我的猜测是,在第一种情况下,请求只被添加到Request estQueue中,这就是为什么调用取消全部()有效。在第二种情况下,启动请求和暂停/销毁Activity之间有一个轻微的延迟:在那个延迟中,HTTP请求已经开始。您可能没有意识到,调用取消全部()仅适用于那些仍在Request estQueue中的请求。它不适用于已经开始的HTTP请求,没有办法阻止它。

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

    匿名用户

    您可以取消附加到TAGRequest。所以基本上你必须在每个Request中添加一个标签。

    您的请求对象。设置标签(TAG);

    Request estQueue mRequest estQueue;

    m请求队列。全部取消(TAG);

    这样您就可以使用特定的TAG取消所有Request

    匿名用户

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

    这基本上是说

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

    因此,即使没有办法撤消/取消已经开始的超文本传输协议请求(这是有道理的),也不会调用与请求关联的回调,这对我来说实际上意味着我可以在大多数情况下处理已取消的请求,即使这样收到的响应可能在缓存中可用。