Volley的引用导致内存泄漏

Android Volley 与AsyncTask 请求对比内存泄漏 Android 使用Volley时候内存不能回收。 立即下载

Volley的引用导致内存泄漏

  前两天用leakcanary检查自己做的应用时,发现居然报内存泄漏的错误,而且内存泄漏出现的原因是由于Volley使
用的问题,查看leakcanary打出的Log发现是由于Volley中的Listener导致,这让我很疑惑,为什么开源的框架Volley怎么会出现内存泄漏这种问题。

  在网上搜索了一下相关问题,发现出现这种问题的人还真不少,解决的方法也有很多种,列举一下我查到的解决方法:
1.升级Volley包,有一个博客说将Volley的jar包升级一下版本(感觉不靠谱,没有试)
2.使用单例模式,使用ApplicationContext,我看了一下我的代码,发现我用的就是单例模式,在Application中初始化RequestQueue,所以这种方法不能解决我的问题。
3.重点:
在一篇关于这个问题讨论的帖子中我发现了一条评论,感觉他说的很有道理,这个人的评论是这样的:

我觉得,楼上回复的都不是重点!Queue 用单例来封装是对的,但是内存泄漏明显不是因为是不是单例原因造成的,是因为楼主写的 new Response.Listener() 这句使用了内部匿名类,因为他初始化的时候是在HeapTestActivity 里面自动生成一个内部类,那么这个内部类没有执行完毕的时候,是持有HeapTestActivity 的引用的,导致HeapTestActivity 不能被回收,从而导致内存泄漏!

分析:
我感觉这个人的解释我很赞同,内存泄漏很大一部分出现的原因就是因为匿名内部类持有外部类的引用导致,外部类不能被垃圾回收器回收,所以导致内存泄漏。在这个例子里面,因为Volley使用的GsonRequest执行的是网络操作,Android中网络操作和UI线程是异步的,所以,可能在网络操作中,由于耗时操作没有执行完毕,导致Listener持有的Activity实例不能被销毁,而导致内存泄漏。

解决方式:
既然是由于Listener持有Activity的引用导致Activity不能被及时销毁,那么就要用到JAVA的四种引用中的WeakReference了,这个解决方式的是我收到的一篇博客,原文链接,其实思想很简单,就是实现以下Volley中的Listener和ErrorListener接口,在其中使用WeakReference在初始化Listener中持有Activity的引用,这样就可以解决Volley中内存泄漏的问题了
(实测原来的内存泄漏没有了)

为了便于方便,我将郭神提供的GsonRequset二次封装了一下,方便下次使用。

public class GsonRequest<T> extends Request<T> {

    private final Response.Listener<T> mListener;

    private Gson mGson;

    private Class<T> mClass;

    public GsonRequest(int method, String url, Class<T> clazz, WeakListener<T> listener,
                       WeakErrorListener errorListener) {
        super(method, url, errorListener);
        mGson = new Gson();
        mClass = clazz;
        mListener = listener;
    }

    public GsonRequest(String url, Class<T> clazz, WeakListener<T> listener,
                       WeakErrorListener errorListener) {
        this(Method.GET, url, clazz, listener, errorListener);
    }

    @Override
    protected Response<T> parseNetworkResponse(NetworkResponse response) {
        try {
            String jsonString = new String(response.data,
                    HttpHeaderParser.parseCharset(response.headers));
            return Response.success(mGson.fromJson(jsonString, mClass),
                    HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingException e) {
            return Response.error(new ParseError(e));
        }
    }

    @Override
    protected void deliverResponse(T response) {
        mListener.onResponse(response);
    }

    public static abstract class WeakListener<T> implements Response.Listener<T> {
        private final WeakReference<Activity> activityWeakReference;

        public WeakListener(Activity activity) {
            activityWeakReference = new WeakReference<Activity>(activity);
        }

        @Override
        public abstract void onResponse(T response);
    }

    public static abstract class WeakErrorListener implements Response.ErrorListener {
        private final WeakReference<Activity> activityWeakReference;

        public WeakErrorListener(Activity activity) {
            activityWeakReference = new WeakReference<Activity>(activity);
        }

        @Override
        public abstract void onErrorResponse(VolleyError error);
    }

}
802.1AS-2011_Gptp协议栈 GPTP(广义时钟同步协议,或IEEE 802.1AS)的基本功能是确保局域网中所有的时钟都同步,并提供时间信息。这种协议用于在局域网中进行同步和时间对齐,其目的是确保网络中各设备的时间一致性。 阅读详情

相关推荐

避坑指南:用Adams做滚珠丝杠仿真时90%人会遇到的3个建模错误

本文针对使用Adams进行滚珠丝杠动力学仿真时常见的三大建模错误,提供了详细的避坑指南。重点解析了如何避免因直接导入CAD几何体导致的性能与精度问题,科学设置接触参数以提升计算效率与结果平滑度,以及通过规范的命名与组织管理模型,确保仿真过程高效可靠。

gin88的博客 573

android volley 内存溢出,volley内存溢出的问题所在

在网络请求中有网络溢出现象,可能大家很少见到过这种情况,可为了解决这问题。为此学习啦小编为大家整理推荐了,希望大家喜欢。volley内存溢出官网上有写,然后创建RequestQueue 的时候用Application的context。If your application makes constant use of the network, it's probably most efficient...

weixin_30851655的博客 178

华大HC32F460从零到200MHz:手把手教你配置时钟系统(附避坑指南)

本文详细解析了华大HC32F460 MCU的时钟系统配置,从启动过程、时钟树分析到实战配置200MHz系统时钟。文章手把手指导开发者如何正确配置外部晶振、MPLL锁相环及总线分频,并提供了硬件检查、代码解读及常见问题排查的避坑指南,帮助用户从零构建稳定可靠的高性能时钟环境。

net55的博客 296

Volley的网络请求有内存溢出现象学到的一点知识

今天进行程序内存溢出/泄露测试,使用的是LeakCanary,发现除了几个上一个开发者开发习惯问题(什么都喜欢使用静态变量,而且是public的到处调用)外,基本都是报Volley的错误监听回调有溢出,经过百度后发现是因为RequestQueue重复获取的问题,获取一次就新建一个RequestQueue对象,而之前的还在进行网络请求的的就形成了泄露。 解决方案很简单,把自己的volley工具类定

xfnbing的专栏 2077

【Android】条形码/二维码扫描——ZXing源码分析

正在更新中 针对3.2.1版本源码 与其他版本代码可能会有出入,但核心思想基本不变。 首先从com.google.zxing.client.android包中的目录结构分析:Book:这个文件夹中有5个类: BrowseBookListener 实现了adapter的点击事项响应,通过获取ISBN,然后跳转到Google books中查询响应的详细信息。 SearchBookContents

年轻的学徒 2453

别再死记硬背了!用‘瞬时极性法’5分钟搞定三极管反馈电路类型判断

本文介绍了使用‘瞬时极性法’快速判断三极管反馈电路类型的高效技巧。通过假设输入信号变化并追踪传递路径,该方法能准确区分正负反馈、电压电流反馈、串联并联反馈及交直流反馈,避免传统死记硬背的弊端,显著提升电路分析效率。

weixin_42524708的博客 183

【Volley】Volley的网络请求有内存溢出现象

官网上有写,然后创建RequestQueue 的时候用Application的context。 If your application makes constant use of the network, it’s probably most efficient to set up a single instance of RequestQueue that will last ...

明天你好-博客 717

【异常】‘build.plugins.plugin.version‘ for org.apache.maven.plugins:maven-resources-plugin is missing

maven-compiler-plugin 插件版本信息没有指定导致了错误提示如下字面意思就是没有指定版本信息。

奶爸的编程之路,也就一周冷个三天 4599

Volley的网络请求内存溢出

摘自:http://www.oschina.net/question/1781692_2133941 这几天发现Volley的网络请求有 内存溢出 现象。(检测工具是MAT,LeakCanary)  感觉现象很常见,也许大家还没发现,或着已经解决 ? 1 2 3 4 5 6 7 8 9

aiguoguo000的博客 763

如何理解S参数的三大特性

提到S参数的时候经常会涉及一些概念,如无源性、因果性、互易性等,本文逐一介绍这些特性的概念、成因以及判断方式。

一只豌豆象的博客 4497

实战!用Python爬取海关总署进出口贸易数据 —— 从反爬突破到数据可视化全流程指南

{"period": "2026-05", "country": "美国", "import_val": 123.4, "export_val": 567.8, ...}研究员可构建领先指标模型;fig = px.bar(top, x="country", y="total_usd", title="贸易总额TOP10")html.H1("海关进出口数据看板", style={"textAlign": "center"}),"""发起带签名的POST请求(实际为GET + query param)"""

2201_76125261的博客 588

Volley框架内存泄露的排查及解决方案

最近在排查项目的内存泄露问题,在使用了Volley后,发现leakCanary一直会报内存泄露的错误提示。 于是网上查了下volley内存泄露的资料,发现还不少。 https://github.com/mcxiaoke/android-volley 这个分支的volley解决了内存泄露问题,而google原生的项目还没有解决: https://github.com/google/volle...

尼古拉斯的AI笔记 749

FPGA 学习笔记:解决FPGA程序固化重新上电程序不运行的问题

FPGA 学习笔记:解决FPGA程序固化重新上电程序不运行的问题

坚韧与专注 1万+

用正确的姿势使用volley

今天使用leak canary进行内存泄露时发现activity发生了内存泄露 我之前使用volley的方法就是在activity onCreate的时候新建一个volley消息队列。 经过搜索发现,原来是在新建队列的时候会将activity context的引用穿进volley框架内部,导致activity在finish的时候无法被正常释放内存。 推荐的方法是使用单

EdwardWayne的专栏 1042

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Android优雅网络请求,Android优雅地发起网络Request与接收Response

Android发起网络Request与接收Response以下几种写法很常见:1、直接 new Thread 进行请求,数据返回后使用 handler 回到主线程进行 UI 刷新。private void getData() {new Thread(new Runnable() {@Overridepublic void run() {final String result = GetDataHe...

weixin_42360977的博客 998

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

android volley 超时,android – Volley缓慢而导致内存泄漏

在我的项目中,我使用volley来下载一个JSON流,我将其解析并显示在列表视图中.我使用以下方法加载我的数据:private void loadEventData(int year, final int month) {// get volley request queuerequestQueue = cpcApplication.getRequestQueue(getActivity());S...

weixin_42463165的博客 336

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Android Volley 框架

1、Volley到底有哪些特点呢? 自动调度网络请求 多个并发的网络连接 通过使用标准的HTTP缓存机制保持磁盘和内存响应的一致 支持请求优先级 支持取消请求的强大API,可以取消单个请求或多个 易于定制 健壮性:便于正确的更新UI和获取数据 包含调试和追踪工具 2、Volley中的RequestQueue 和 Request RequestQueue 用来执行请求的请求队列 Request 用来...

lsyksy的博客 911

发现 Volley 内存泄漏,求解。

最近两天在对app进行内存优化, 用volley加载列表数据, 然后又调用activity的finish方法关闭activity,反复操作,通过DDMS查看可发现很大一部分内存没有释放。 刚开始怀疑是自己编码问题,后经过自己反复检查并与AsyncTask请求方式对比发现确实volley有内存泄漏。 这里有我的测试代码, 有兴趣的可以看一看,顺便帮查查是不是我代码编写的有问题(本人Andr

zhw_china的博客 1484

Volley中listener导致的内存泄露

项目中用Volley作为http框架,封装了一个JsonRequest,性能优化的时候,LeakCanary一直提示Volley的listener内存泄露,检查了很久也没发现哪里出现内存泄露 public class JsonRequestImpl extends JsonRequestJSONObject > { public JsonRequestImpl(int method,

聚精会神搞建设 3091

Volley框架请求取消的实现

Volley网络框架发送请求后,页面退出时需要取消已经添加但还没有完成的请求,否者会导致内存泄漏或者crash,比如请求中持有上下文,Activity,但是网络请求还没有完成,仍然持有引用,导致该回收的内存,gc无法回收,从而导致内存泄漏的发生。还有如果Activity退出时没有取消请求,在请求回调设置页面数据时,此时页面已经销毁,但是仍然给页面的控件设置数据时,就会导致空指针的发生。 Vo...

青春染指流年的博客 3321

Volley导致内存泄露

在一次使用Android Monitor为项目做内存泄露分析的时候,发现Volley会造成内存泄露通过上图可以看到是因为StringRequest的两个请求回调接口占用造成的Activity内存泄露,经过查找资料发现是因为Volley的bug造成的解决办法:改用 https://github.com/mcxiaoke/android-volley 通过对这个库的简单研究,发现与google的Voll

chengliang0315的博客 1567

Android Volley动态ListView:AsyncTask比较

在这篇文章中,我将首先描述如何使用Volley动态填充 ListView,然后将其与AsycnTask进行比较。 在本文中,我们将调用一个远程服务以JSON格式获取联系信息,并在ListView中填充项目。这个简单的示例对于理解Volley库及其集成方式非常有用。 我们想要获得如下图所示的图像: 我们已经在上一篇文章中介绍了该主题,这是强调不同方法( Volley和AsyncTa...

184

volley中的内存泄露

今天对终于写好的APP进行测试时,发现有严重的内存泄露。使用LeakCanary分析,发现是volley引起的。 参考http://www.jianshu.com/p/c87677f01ed5和https://github.com/mcxiaoke/android-volley/pull/64,发现: 原因:在官方的volley包中,NetworkDispatcher中的run方法中,当请求队列

如故 1248

Android之Volley

简介: Volley是Google I/O 2013上Google官方发布的一款Android平台上的网络通信库。 以前的网络请求,要考虑开启线程、内存泄漏、性能等等复杂的问题。但是Volley框架已经帮我们把这些问题处理好了,对外提供了相应的完善的请求API,我们只需要按照要求使用即可。 特点: 能使网络通信更快,更简单,更健壮 Get、Post网络请求及网络图像的高效率异

bear_huangzhen的专栏 2451

soas项目网络请求机制解析:Volley框架的高效应用

soas项目(GitHub 加速计划)是一个面向初学者和有经验开发者的Native Android示例项目,专注于Lollipop及Material Design设计规范。在移动应用开发中,高效的网络请求处理是提升用户体验的关键环节,soas项目采用Volley框架构建了稳定可靠的网络请求机制,本文将深入解析其实现原理与应用技巧。 ## Volley框架的核心优势与项目集成 Volley作为A

gitblog_00128的博客 607

单例模式创建Volley框架的RequestQueue

总所周知,每次使用Volley处理网络请求都需要将网络请求加入到一个RequestQueue的队列中去,当使用网络请求的Activity或者Fragment较少时,我们大可以在每次使用前实例化一个RequestQueue。但是当网络请求频繁且使用的

seven_forjob的专栏 1722
上一篇: android studio 导入项目太慢解决方式
下一篇: 自定义View----仿仪表盘的水柱进度条(高度定制化,已通过JitPack发布)
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值