Dab*_*ler 5 java android memory-leaks
我对 Java 编程相当陌生,具有丰富的 C++ 经验,并且我正在阅读有关引用如何导致 Android 应用程序中内存泄漏的内容。这个解释把我难住了。在“第 2 课”中,它说:
\n\n\n\n\n关键是,Activity 并不知道 SomeObject 的生命周期将在 Activity 实例结束时结束。如果该对象保留在内存中,它也会将该 Activity 保留在内存中[...]。
\n
正如我所见(可能是错误的;请纠正我),当活动结束时,它SomeObject会被销毁(假设不存在对其的其他引用)。活动引用SomeObject,而不是相反。我不明白为什么这里有任何内容被泄露,更不用说整个活动了。
这与他们为 EventListener 创建匿名类这一事实有关。
\n\npublic void onResume() {\n super.onResume();\n\n SomeObject object = new SomeObject();\n\n object.setSuccessListener(new EventListener<Boolean>() {\n public void onEvent(Boolean response) {\n Log.d(TAG_NAME, "Valid response? "+response);\n }\n });\n\n SomeObjectManager.getSingleton().addObject(object);\n}\nRun Code Online (Sandbox Code Playgroud)\n\n它明确指出这是在 Activity 的 nonResume() 中完成的。
匿名类(以及非静态内部类)具有对其周围类的隐式引用。因此在这种情况下,EventListener 具有对 Activity 本身的引用。
因此,SomeObject 具有对 Activity 的引用,因为它具有对实现 EventListener 的 Anonymous 类的引用。
这是您在问题中引用的引用之前的文本:
\n\n\n\n\n例如,在上面的示例中:我们\xe2\x80\x99将对\n Activity 实例的引用附加到某个对象(大概是持久的),并在\n 管理器中的某个位置。重点是...
\n
因此,SomeObjectManager 类在 Activity 被销毁时不会消失,它持有对 SomeObject 的引用,而 SomeObject 持有对 EventListener 的引用,而 EventListener 又引用 Activity。
\n\n所以当你说:
\n\n\n\n\n正如我所见(可能是错误的;请纠正我),当活动结束时,SomeObject 被销毁(假设不存在对它的其他引用)。该活动引用 SomeObject,而不是相反。
\n
该逻辑中的缺陷是 SomeObject 确实通过 EventListener 引用了该活动。
\n\n这有帮助吗?
\n| 归档时间: |
|
| 查看次数: |
739 次 |
| 最近记录: |