我是否应该担心内存泄漏并在Android中使用WeakReference和Volley

Sia*_*ash 7 android android-volley

阅读完这篇文章后,我开始考虑与Volley的内存泄漏.通常,使用Volley实现的侦听器具有对外部类(活动)的隐式或显式引用.例如:

JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.GET,
        url, null, 
        new Response.Listener<JSONObject>() {
            @Override 
            public void onResponse(JSONObject response) {

                updateLayout(); 
            } 
        }
Run Code Online (Sandbox Code Playgroud)

在这种情况下有一个隐式引用...或者我可能想创建一个自定义JsonObjectRequest来内化响应处理,并需要在其构造函数中传入对调用活动的引用.

现在让我说我开始一个Web请求,但在响应回来之前,我离开了启动请求的活动.根据我的理解,JsonObjectRequest对象将保留对我的活动的引用并防止它被垃圾收集.
- 我正确理解这一点,这是一种合理的恐惧吗?
- Volley库会自动处理这个吗?
- 如果我正在创建一个自定义的JsonObjectRequest并传入一个"this"(对活动的引用),我是否需要为该活动创建一个WeakReference?

Pir*_*ada 5

基于查看齐射代码,调用cancel并不能真正避免内存泄漏,因为引用永远不会被清除且引用不弱.调用取消只能避免Volley向听众传递响应.

我对这个问题的解决方案必须自己克隆和修改库.

  • 其中一个解决方案可以是在基础Request.java中使基本ErrorListener引用成为弱引用.类似地,可以对JsonRequest.java中的Listener进行相同的操作.

  • 另一种解决方案是在取消被调用时手动清除引用.在cancel()内部,将mErrorListener和mListener设置为null.但是,使用此解决方案,您必须从字段声明中删除最终修饰符,否则您将无法将引用设置为null.

希望这可以帮助.