【问题标题】:Android - cancel Volley requestAndroid - 取消 Volley 请求
【发布时间】:2015-05-17 01:12:46
【问题描述】:

我在我的项目中使用 Android Volley 库来执行网络请求,一切正常,但我在使用该库的“取消”功能时遇到了一些问题。我解释我的问题..

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

  1. 我触发了我的请求,然后像这样取消它:

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

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

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

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

但这不起作用

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

感谢您的帮助

【问题讨论】:

    标签: android request android-volley


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢 Zygoteinit !那么,取消当前请求是不可能的,但可以取消未来的待处理请求,对吧?这就是你所说的HTTP请求行为
    • 是的,不可能取消已经已经开始的请求,原因很明显(网络调用一旦开始就必须完成)。只有那些仍在RequestQueue 中的请求才能被停止,因为它们还没有开始。我希望你能理解这一点。
    • 是的,我理解这个原因,太糟糕了,因为它会造成内存泄漏。谢谢你的回复;)
    • @Y.S.我处于棘手的境地。可以说凌空请求开始了,突然我退出了我的应用程序。退出我的应用程序后,这将我带到NullPointerException。我相信片段应该随着它的活动而退出。但即便如此,Volley Request 仍然有效,并在到达ErrorLIstener 时将空指针抛出到我的Toast。请帮忙。我被卡住了。
    • @Roon13:抱歉,this post ... :)
    【解决方案2】:

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

    这基本上是说

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

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

    【讨论】:

      【解决方案3】:

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

      yourRequestObject.setTag(TAG);

      RequestQueue mRequestQueue;

      mRequestQueue.cancelAll(TAG);

      这样您就可以取消所有带有特定TAGRequest

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 嗨,安迪,谢谢,但在尝试 onPause() 时遇到同样的问题。我认为 ZygoteInit 对 http 请求行为是正确的,当请求被触发时,这是不可能取消它的,但它适用于队列中的其他待处理请求
        • 嗨 :) 当然他是对的,我的意思是你可以调用你的函数来处理待处理的请求,但是在 onPause 而不是 onStop 上,因为我认为你想保存一些关于它的信息 :)
        • 是的,确实最好在 onPause() 中取消以保存一些有用的数据;)
        • @Julien 我在 Activity 类中声明了 onResponse() 。我应该在 onResponse 方法中检查这个 == null 吗?
        猜你喜欢
        • 2013-05-22
        • 2013-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-19
        • 2013-11-16
        相关资源
        最近更新 更多