避免android片段中内存泄漏的最佳方法是啥

Posted

技术标签:

【中文标题】避免android片段中内存泄漏的最佳方法是啥【英文标题】:What is the best way to avoid memory leaks in android fragment避免android片段中内存泄漏的最佳方法是什么 【发布时间】:2015-05-04 05:53:33 【问题描述】:

我找到了很多方法来避免 android 片段中的内存泄漏,但哪种方法是最好的呢?

1.调用onDestroyView时设置视图为null

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.设置所有子view=null并移除view

    @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();
        
    

【问题讨论】:

参见参考文献。 ***.com/questions/13421945/… 【参考方案1】:

将变量设置为null 并不意味着它会被GC'd。只有在任何地方都没有其他强引用时,它才会被 GC。

设置setRetainInstance(true) 本身不会使您的Fragment 泄漏,它只是在配置更改时保留Fragment 的该实例。它可能被认为是“有意识的泄漏”,因为您告诉框架您希望在当前 Activity 的生命周期之后保留 Fragment 对象。

现在Fragment 将泄露您的Activity,如果它不是无 UI 的Fragment。发生这种情况是因为具有 UI 的Fragments 将持有对 UI 组件的引用(即TextViewsEditTexts 等),而这些Views 持有对ActivityContext 的引用。为了避免这种情况,您需要将所有这些引用设置为null

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

【讨论】:

有什么样本可以避免内存泄漏吗?当我在 FragmentTabHost 中更改片段时,调用 setContentView 时内存不足。 您可能正在尝试加载需要太多内存的图像。您是否将可绘制对象设置为 ImageView 不要使用 setRetainInstance。 你需要说出你可以用这个布局做什么。然后我们可以帮助您。 他为什么不能使用setRetainInsance()@PedroPauloAmorim?

以上是关于避免android片段中内存泄漏的最佳方法是啥的主要内容,如果未能解决你的问题,请参考以下文章

在用 Actionscript 和 MXML 编写的 Flex 程序中调试内存泄漏的最佳方法是啥?

托管 (.net) 应用程序中内存泄漏的最常见(并且经常被忽视)的原因是啥?

QTcpSocket 在工作进程中连续写入。避免内存泄漏的最佳实践

您如何检测/避免(非托管)代码中的内存泄漏? [关闭]

为什么JAVA的垃圾回收机制无法避免内存泄漏

Android Handler 避免内存泄漏的用法总结