取消所有排球请求Android

EkK*_*KoZ 22 android android-volley

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

mog*_*i57 56

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

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

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

  • `requestQueue?.cancelAll { true }` 更像 Kotln ;) (3认同)
  • 在Kotlin:`mRequestQueue?.cancelAll({true})` (2认同)

pjc*_*jco 18

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

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

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


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

对于任何标记,这都是很好的做法,您还应该注意泄漏您的活动.

解决方案:


您可以使用当前对象:

request.setTag(this);
Run Code Online (Sandbox Code Playgroud)

或者,静态类对象

request.setTag(MyFragment.class);
Run Code Online (Sandbox Code Playgroud)

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

request.setTag(CustomTags.LIST_REQUESTS);
Run Code Online (Sandbox Code Playgroud)

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

像这样的东西:

public class CustomTags
{
    public static final String LIST_REQUESTS="CustomTags:LIST_REQUESTS";
}
Run Code Online (Sandbox Code Playgroud)

更新

我刚注意到我在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
Run Code Online (Sandbox Code Playgroud)


sen*_*eco 1

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