取消所有排球请求Android

目前我正在片段中的停止方法中使用mRequestQueue.cancelAll(getActivity())但显然当我将手机从横向移动到肖像时,它仍然返回请求中生成的数据但导致崩溃,因为持有者为数据剂量已经存在。 任何正确的代码示例代码?

不要使用cancelAll标签,而是使用全通RequestFilter。

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

编辑:这将取消所有活动/片段的所有请求,并且不会对活动生命周期有效。 管理此方法的最佳方法是添加片段唯一的String标记。

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

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

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


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

这对任何标签都是很好的做法,您也应该注意泄漏您的活动。

解决方案:


您可以使用当前对象:

 request.setTag(this); 

或者,静态类对象

 request.setTag(MyFragment.class); 

或者,作为一个单独的类中的常量:

 request.setTag(CustomTags.LIST_REQUESTS); 

CustomTags.LIST_REQUESTS在我看来是最好的(泄漏活动的可能性更小)

像这样的东西:

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

更新

我刚刚注意到我在Volley中标记我的请求时犯了一个错误(尽管上面发布的解决方案很好)。

我仍然认为我会在这里更新一个重要的事情要记住。 按标识排列的凌空标签不值。

因此,重要的是要记住,只是相同字符串值的标记,而不是相同的对象本身,将不会被识别为相同的tag

它类似于两者之间的区别

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

我知道这个答案来得晚,但万一其他人遇到这个问题:

在我的实现中,在将请求添加到队列的位置设置(并覆盖)Tag。

因此,尽管我使用我的Tag取消了请求,但请求队列上的标记不一样(之前已被覆盖)并且未被取消。

记录正在运行的请求并打印出标签,这使我得到了解决方案:

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

在提出请求时您使用了哪个标签? 如果您没有在每个请求上设置标记,它可能永远不会有效。 据我所知,Volley不会自动为您的请求设置标签

如果你从framgment向队列添加请求,你应该像这样取消: mRequestQueue.cancelAll(this) 。 抱歉,如果它不起作用 – 我没有测试这个解决方案。 但我希望这对你有所帮助。

您是否将活动的请求标记设置为? 这是您提供的代码的唯一方式。 cancelAll方法使用您提供的任何标记的标记搜索所有请求并取消它们。

看看这篇文章。 它使用Oto作为单例事件总线。 这样,您可以在重新创建活动或片段时通知排球队列。 您当然可以使用普通的旧接口来监听更改。 作为一个统一的解决方案,BUt Otto看起来不那么冗长和优雅。

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); } }