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

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

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

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

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

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

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

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

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

希望这可以帮助。

我在使用凌空时遇到了内存泄漏,就像你在这里写的一样。每次我都会新建一个听众。

我用泄漏检测泄漏。

当我读到您的文章, http: //www.androiddesignpatterns.com/2013/01/inner-class-handler-memory-leak.html,并将WeakReference用于活动和回调界面(我自定义)时,它就解决了。

我用截击作为单身人士。

 public interface VolleyCallback { void onSuccess(JSONObject result); void onFailed(String error); } private static class SListener implements Response.Listener { private final WeakReference activityWeakReference; private final WeakReference callbackWeakReference; public SListener(Activity activity, VolleyCallback callback) { activityWeakReference = new WeakReference(activity); callbackWeakReference = new WeakReference(callback); } @Override public void onResponse(JSONObject jsonObject) { Activity act = activityWeakReference.get(); VolleyCallback vc = callbackWeakReference.get(); if (act != null && vc != null) { LogUtil.d(TAG, act.toString() + " " + jsonObject.toString()); something you need to do; vc.onSuccess(jsonObject); } } 

我也读到了这个答案, 如何在Java和Android开发中使用WeakReference? ,第二个答案给出了一个例子,就像你提供的文章一样。这很好。

我可能迟到了一年,但我只是想办法解决这个问题。 这里是:

 public interface VolleyCallback { void onSuccess(JSONObject result); void onFailed(String error); } private static class SListener implements VolleyCallback { private final WeakReference activityWeakReference; public SListener(MainActivity activity, VolleyCallback callback) { activityWeakReference = new WeakReference<>(activity); } @Override void onSuccess(JSONObject result){ } @Override void onFailed(String error){ } } 

在这里,您可以使用activityWeakReference.get()来访问MainActivity的所有UI元素。 从http://www.androiddesignpatterns.com/2013/01/inner-class-handler-memory-leak.htmlfind了这个。 这样我们就不需要取消onStop()中的任何请求。 请记住使用activityWeakReference.get().isFinishing && activityWeakReference.get()!=null以避免在活动不存在时崩溃。