取消所有Volley请求Android

目前,我正在使用mRequestQueue.cancelAll(getActivity())停止方法在一个片段,但显然当我把手机从风景到肖像它仍然返回的请求中的数据,但造成的崩溃,因为持有人数据剂量已经存在了。 任何示例代码如何正确地做到这一点?

Solutions Collecting From Web of "取消所有Volley请求Android"

取而代之的是使用cancelAll标签,做一个全通的RequestFilter。

mRequestQueue.cancelAll(new RequestQueue.RequestFilter() { @Override public boolean apply(Request<?> request) { return true; } }); 

编辑:这将取消所有活动/片段的所有请求,并且不适用于活动生命周期。 pipe理这个最好的方法是为你的片段添加一个唯一的string标签。

您应该将标签设置为一个对象,而不是一个方法。

通过将标签设置为getActivity() ,您要求Volley在主线程上使用dynamic方法调用作为对后台线程中发生的请求的引用。

所以当后台线程试图取消请求时,活动可能已经死了。


而不是使用getActivity() ,使用this或其他一些对象或string。

对于任何标签,这是一个很好的做法,您还应该小心漏水。

解决scheme:


你可以使用当前对象:

 request.setTag(this); 

或者,静态类对象

 request.setTag(MyFragment.class); 

或者作为一个独立的类别中的常量:

 request.setTag(CustomTags.LIST_REQUESTS); 

CustomTags.LIST_REQUESTS是我认为最好的(泄漏活动的机会较less)

像这样的东西:

 public class CustomTags { public static final String LIST_REQUESTS="CustomTags:LIST_REQUESTS"; } 

更新

我只是注意到我在填写我在Volley中的请求时犯了一个错误(虽然我上面发布的解决scheme都很好)。

我仍然认为我会在这里更新一个重要的事项要记住。 排球标签不是价值标签。

因此,重要的是要记住,只有相同的string值,而不是同一个对象本身的tag不会被识别为相同的tag

这与之间的区别是相似的

 String a1 = "A"; String a2 = "A"; a1 == a2; //evaluates to false String a1 = "A"; String a2 = "A"; a1.equals(a2); // evaluates to true 

我知道这个答案来得晚,但如果其他人有这个问题:

在我的实现中,标签在请求被添加到队列的时候被设置(和覆盖)。

所以,尽pipe我用我的标记取消了请求,但请求队列上的标记与之前覆盖的标记不同,并且没有被取消。

logging运行中的请求并打印出标签,使我find了解决scheme:

 mRequestQueue.cancelAll(new RequestQueue.RequestFilter() { @Override public boolean apply(Request<?> request) { Log.d("DEBUG","request running: "+request.getTag().toString()); return true; } }); 

提出请求时,您使用了哪个标签? 如果您未在每个请求上设置标签,则可能无法正常工作。 就我所见,Volley不会自动为您的请求设置标签

如果你添加请求从队列中排队,你应该像这样取消: mRequestQueue.cancelAll(this) 。 对不起,如果它不工作 – 我没有testing这个解决scheme。 但我希望这对你有帮助。

你是否设置了活动请求的标签? 这是您提供的代码的唯一方式。 cancelAll方法使用您提供的任何标签的标签来search所有的请求,并取消它们。

检查这篇文章。 它使用Oto作为单身事件总线。 这样,当你的Activity或Fragments被重新创build时,你可以通知排队队列。 你当然可以使用一个普通的旧接口,并听取更改。 BUT Otto看起来不像一个统一的解决scheme那么冗长和优雅。

http://andraskindler.com/blog/2013/eventbus-in-android-an-otto-example/

在片段的情况下; 只使用一个RequestQueue rQueue;OnCreate method;初始化它OnCreate method; 并用于所有凌空的要求; 并在最后

@覆盖

 public void onStop () { super.onStop(); if (rQueue != null) { rQueue.cancelAll(this); } }