当前位置: 首页 > 知识库问答 >
问题:

避免android fragment内存泄漏的最佳方法是什么

葛炜
2023-03-14

我在android fragment中找到了许多避免内存泄漏的方法,但哪种方法是最好的?

1.将视图设置为null时onDestRoyView被调用

public class LeakyFragment extends Fragment{

    private View mLeak; // retained

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        mLeak = inflater.inflate(R.layout.whatever, container, false);
        return mLeak;
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        mLeak = null; // now cleaning up!
    }
}

2.将所有子视图设置为null并删除该视图

    @Override
    public void onDestroyView(){
        super.onDestroyView();
        unbindDrawables(mLeak);
    }

    private void unbindDrawables(View view){
        if (view.getBackground() != null){
            view.getBackground().setCallback(null);
        }
        if (view instanceof ViewGroup && !(view instanceof AdapterView)){
            for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++){
                unbindDrawables(((ViewGroup) view).getChildAt(i));
            }
            ((ViewGroup) view).removeAllViews();
        }
    }

共有1个答案

公冶宏深
2023-03-14

将变量设置为null并不意味着它将获得GC'd。只有在任何地方都没有其他强有力的引用时,它才会被气相色谱识别。

设置setRetainInstance(true)本身并不会使您的片段泄漏,它只是在配置更改中保留片段的实例。这可能被认为是有意识的泄漏,因为您正在告诉框架您希望在当前的活动生命周期之后保留片段对象。

现在,如果不是无用户界面的碎片,碎片将泄漏您的活动。发生这种情况是因为具有UI的Fragments将保存对UI组件的引用(即TextViewsEditText等),并且这些Views保存对活动上下文的引用.为了避免这种情况,您需要像现在这样将所有这些引用设置为null

此外,您可能还需要从其父级中删除mLeak

 类似资料:
  • 问题内容: 所以我有这个C ++程序,它是通过Java程序中的JNI调用的,代码如下: 在倒数第二行中,从不释放而是返回,是否会导致最终的内存泄漏?反正有解决这个问题的方法吗? 还有可能不是返回字符串而是返回布尔值(由LogonUser函数返回),而不是jstring,而是添加了要在方法中传递的“ errormessage”引用,并更新了它?我的Java程序能否看到“ errormessage”的

  • 本文向大家介绍什么是内存泄漏?相关面试题,主要包含被问及什么是内存泄漏?时的应答技巧和注意事项,需要的朋友参考一下 答:一般我们所说的内存泄漏指的是堆内存的泄漏。堆内存是程序从堆中为其分配的,大小任意的,使用完后要显示释放内存。当应用程序用关键字new等创建对象时,就从堆中为它分配一块内存,使用完后程序调用free或者delete释放该内存,否则就说该内存就不能被使用,我们就说该内存被泄漏了。

  • 问题内容: 有效的Java说: 内存泄漏的第三个常见来源是侦听器和其他回调。如果在客户端注册回调但未显式注销的情况下实现API,除非您采取某些措施,否则它们会累积。确保回调被及时垃圾回收的最佳方法是仅存储对其的弱引用,例如,通过仅将它们作为键存储在WeakHashMap中。 我是Java的初学者。有人可以教我如何在回调中创建弱引用,并告诉我它们如何解决内存泄漏问题吗?谢谢。 问题答案: 阅读这篇文

  • 我读了很多关于如何避免Android内存泄漏的文章,但我仍然不太确定我是否做对了。 我的应用程序由一个活动组成 问题1:这够了吗? 让我困惑的是,你可以在网上找到一个经典的“不去”的例子(http://www.curious-creature.org/2008/12/18/avoid-memory-leaks-on-android/): 我认为,一旦创建完成, 检索上下文,将其传递给手动创建的查看

  • 我是android开发的新手,我刚刚从以下链接读到了Romain Guy的“避免android内存泄漏” http://www.curious-creature.org/2008/12/18/avoid-memory-leaks-on-android/ 然后我在我的android模拟器上用他著名的代码片段做了一个小测试 此代码应该在更改方向时泄漏第一个活动上下文。因此,我在emulator中运行了

  • 我正在一个项目,需要处理成千上万的活动套接字并发连接。现在我正在查看内存使用和V8引擎,我使用的是Node.js V0.10.19(稳定)