23

目前我在片段中的 on stop 方法中使用 mRequestQueue.cancelAll(getActivity()) 但显然当我将手机从横向移动到纵向时,它仍在返回请求中生成的数据,但由于持有者导致崩溃数据不再存在。有关如何正确执行此操作的任何示例代码?

4

9 回答 9

59

不要为 cancelAll 使用标签,而是创建一个全通的 RequestFilter。

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

编辑:这会取消所有活动/片段的所有请求,并且不适用于活动生命周期。管理此问题的最佳方法是为您的片段添加唯一的字符串标签。

于 2013-10-03T01:11:29.883 回答
19

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

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

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


而不是 using getActivity(), usethis或其他一些对象或字符串。

这对于任何标签都是一个很好的做法,您还应该注意泄露您的活动。

解决方案:


您可以使用当前对象:

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
于 2013-08-29T01:24:04.247 回答
4

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

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

因此,尽管我使用我的标签取消了请求,但请求队列上的标签并不相同(因为它以前被覆盖)并且它没有被取消。

记录运行的请求并打印出标签,我找到了解决方案:

mRequestQueue.cancelAll(new RequestQueue.RequestFilter() {
    @Override
        public boolean apply(Request<?> request) {
        Log.d("DEBUG","request running: "+request.getTag().toString());
            return true;
        }
});
于 2013-11-22T12:58:25.593 回答
3

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

于 2013-06-14T08:28:36.127 回答
1

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

于 2013-06-06T06:38:31.643 回答
0

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

于 2013-10-03T18:45:23.590 回答
0

在碎片的情况下;仅使用一个 RequestQueue rQueue; 初始化它OnCreate method; 并将其用于所有凌空请求;最后

@Override

public void onStop () {

    super.onStop();
    if (rQueue != null) {
        rQueue.cancelAll(this);
    }
}
于 2017-10-23T06:23:56.420 回答
0

在科特林

  requestQueue?.cancelAll { true }
于 2020-12-14T13:08:18.377 回答
-1

我一直在与内存泄漏作斗争,直到我发现我从类“RequestQueue”中调用了 stop()。

//Initialize the object
RequestQueue requestQueue = 
        Volley.newRequestQueue(getActivity().getApplicationContext());

//Release the object
requestQueue.stop();
requestQueue = null;

该类说它“停止缓存和网络调度程序”。不管什么意思...

于 2019-02-09T00:32:36.893 回答