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;
        }
    });
编辑:这将取消所有活动/片段的所有请求,并且不适用于活动生命周期.管理此方法的最佳方法是添加片段唯一的String标记.
pjc*_*jco 18
您应该将标记设置为对象,而不是方法.
通过将标记设置为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
如果您从framgment添加请求到队列,您应该像这样取消mRequestQueue.cancelAll(this):如果它不起作用,我很抱歉 - 我没有测试这个解决方案。但我希望这对你有帮助。
| 归档时间: | 
 | 
| 查看次数: | 28523 次 | 
| 最近记录: |