目前,我正在使用mrecestQueue.cancelAll(getActive())在一个片段中的on Stop方法,但显然,当我将手机从横向移动到纵向时,它仍然返回请求中的数据,但会导致崩溃,因为持有人数据泄露已经存在了。有什么如何正确处理的示例代码吗?
我知道这个答案来得很晚,但如果其他人有这个问题:
在我的实现中,Tag在请求被添加到队列的地方被设置(和覆盖)。
因此,尽管我用我的标记取消了请求,请求队列上的标记是不一样的(因为它以前被覆盖),它没有被取消。
记录正在运行的请求并打印出标记,使我找到了解决方案:
mRequestQueue.cancelAll(new RequestQueue.RequestFilter() {
@Override
public boolean apply(Request<?> request) {
Log.d("DEBUG","request running: "+request.getTag().toString());
return true;
}
});
您应该将标记设置为对象,而不是方法。
通过将标记设置为getActive()
,您要求Volley使用主线程上的动态方法调用作为对后台线程上发生的请求的引用。
因此,当后台线程试图取消请求时,活动可能已经死了。
与其使用getActive()
,不如使用this
或其他一些对象或字符串。
这对于任何标签都是很好的做法,而且您还应该小心泄漏您的活动。
解决:
您可以使用当前对象:
request.setTag(this);
或者,静态类对象
request.setTag(MyFragment.class);
或者,作为单独类中的常量:
request.setTag(CustomTags.LIST_REQUESTS);
自定义标签。列出我认为最好的请求(泄漏活动的可能性较小)
大概是这样的:
public class CustomTags
{
public static final String LIST_REQUESTS="CustomTags:LIST_REQUESTS";
}
最新消息
我刚刚注意到我在Volley中标记我的请求时犯了一个错误(尽管我在上面发布的解决方案很好)。
我仍然认为我会在这里更新一件重要的事情要记住。按标识而不是值截击标记。
因此,重要的是要记住,仅仅是相同字符串值而不是相同对象本身的标记将不会被识别为相同的标记。
这与
String a1 = "A";
String a2 = "A";
a1 == a2; //evaluates to false
String a1 = "A";
String a2 = "A";
a1.equals(a2); // evaluates to true
不要对cancelAll使用标记,而是创建一个全通RequestFilter。
mRequestQueue.cancelAll(new RequestQueue.RequestFilter() {
@Override
public boolean apply(Request<?> request) {
return true;
}
});
编辑:这将取消来自所有活动/片段的所有请求,并且不适用于活动生命周期。最好的管理方法是为片段添加一个唯一的String标记。
问题内容: 我正在制作网络爬虫。我将网址传递给搜寻器函数,并对其进行解析以获取锚标记中的所有链接,然后为所有这些网址使用相同的搜寻器函数,并对每个网址使用单独的goroutine。 但是,如果在我收到响应之前发送请求并取消它,则该特定请求的所有程序仍在运行。 现在我想要的是,当我取消请求时,由于该请求而被调用的所有goroutine都会停止。 请指导。 以下是我的 搜寻器 功能代码。 以下是我的P
我使用youtube API制作了一个应用程序。首先,我使用< code > retrieve 加载视频列表,然后我继续使用< code > retrieve 加载列表中视频的所有信息。 由于<code>列表视图<code>支持刷新和加载更多,我需要<code>取消<code>所有调用请求。 我知道调用了<code>cancel()cancel()。 还有更好的解决方案吗?
如何取消/中止angular 4中所有挂起的HTTP请求。 有一个取消HTTP请求的方法,但是如何一次取消所有挂起的请求。 尤其是在改变路线的时候。 我做了一件事 但是如何在全球范围内实现这一点 有什么想法吗?
javax.net.ssl.SSLHandShakeException:>java.security.cert.certPathValidatorException:未找到证书的信任锚>路径。 这条信息是什么意思?
问题内容: 我在将OkHttp 2.7.0与Retrofit 2-beta2结合使用。 为了从Retrofit 获取对象,我正在使用Retrofit .client() 方法并取消所有正在运行的请求,我将其称为cancel(Object tag) 方法,但是请求仍然保持运行,并且得到响应。 即使客户的getQueuedCallCount()和getRunningCallCount()返回0调用ca
我使用改造2-beta2与OkHttp 2.7.0。 为了从改造中获取对象,我正在使用改造.client()方法并取消所有正在运行的请求,我正在调用它的unund(Object tag)方法,但请求仍然保持运行,我得到一个响应。 甚至客户端的< code>Dispatcher的getQueuedCallCount()和getRunningCallCount()在调用cancel()后返回0。 我还