DialogFragment泄漏内存

mpe*_*egr 5 android memory-leaks android-dialogfragment

在我正在研究的应用程序中,我在DialogFragment中看到内存泄漏,到目前为止修复它的唯一方法是在DialogFragment被销毁时删除所有视图,这是正常的事情吗?我正在使用自定义ROM,因此不确定是否可能与此问题有关.有没有理由不从对话框中删除所有视图会导致它们泄漏内存?

    @Override
    public void onDestroyView() {
        if (getView() instanceof ViewGroup) {
            ((ViewGroup)getView()).removeAllViews();
        }
        super.onDestroyView();
    }
Run Code Online (Sandbox Code Playgroud)

Jiy*_*yeh 6

这也发生在我的应用程序中,我发现泄漏使用Leakcanary.

当你有一个带EditText的Dialog时会发生这种情况.关闭包含EditText的View时,无法正确处理使用回调实现的Cursor的Blink.它根据这个偶然发生.

https://code.google.com/p/android/issues/detail?id=188551

编辑

这就是我之前做的事情dialog.dismiss():

editText.setCursorVisible(false);
dismiss();
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!


Moj*_*Asg 4

MemoryLeak发生的原因有很多,以下是一些常见原因:

  • 在某些静态字段中保留对象的引用(在本例中为 DialogFragment 的实例)。
  • 传递ContextThreadAsyncTask,因为Threads也是GC root
  • 你的类有非静态内部类,在这种情况下,如果内部类与 GC root 相关(例如,如果内部类是 的实例AsyncTask),就会发生内存泄漏。

在您的情况下,也许您有一个与 GC root 相关的视图,而该视图无法被垃圾收集,而保留视图的对话框也无法被垃圾收集。