看完之后本文 http://www.androiddesignpatterns.com/2013/01/inner-class-handler-memory-leak.html,我开始考虑 Volley 的内存泄漏问题。
通常,用 Volley 实现的侦听器具有对外部类(活动)的隐式或显式引用。例如:
JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.GET,
url, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
updateLayout();
}
}
在这种情况下,存在隐式引用...或者我可能想要创建一个自定义 JsonObjectRequest 来内部化响应处理,并且需要在其构造函数中传递对调用活动的引用。
现在假设我启动了一个 Web 请求,但在响应返回之前,我离开了启动该请求的活动。据我了解,JsonObjectRequest 对象将保留对我的活动的引用并防止其被垃圾收集。
-我的理解正确吗?这是合理的恐惧吗?
- Volley 库会自动处理这个问题吗?
-如果要创建自定义 JsonObjectRequest 并传入“this”(对活动的引用),我是否需要创建对该活动的 WeakReference?
根据查看 volley 代码,调用 cancel 并不能真正避免内存泄漏,因为引用永远不会被清除,并且引用并不弱。调用 cancel 只会避免 Volley 将响应传递给侦听器。
我对这个问题的解决方案必须是自己克隆和修改库。
解决方案之一是将基类 Request.java 内的基类 ErrorListener 引用设置为弱引用。同样,可以对 JsonRequest.java 内部的监听器执行相同的操作。
另一种解决方案是在调用取消时手动清除引用。在cancel()内部,将mErrorListener和mListener设置为null。但使用此解决方案时,您必须从字段声明中删除 Final 修饰符,否则您将无法将引用设置为 null。
希望这可以帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)