多次显示和关闭时,Android AlertDialog会泄漏内存吗? 1 MainActivity.java 2 activity_main.xml

问题描述

我有一个简单的活动,只有一个按钮可以弹出一个简单的对话框。代码是:

1。 MainActivity.java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void showDialogBlank(View dumbView) {
        AlertDialog.Builder dlgBuilder = new AlertDialog.Builder(this);
        dlgBuilder.setTitle("TEST-TITLE")
                .create()
                .show();
    }
}

2。 activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/btnShowDialogBlank"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:onClick="showDialogBlank"
        android:text="btn-blank" />

</LinearLayout>

多次单击按钮和空白区域后,内存如下:

enter image description here

主要,本机内存增长了〜3.6MB ,这不能是GC ...为什么?

解决方法

没有内存泄漏!

是的,当显示对话框时,内存使用增加了,因为它需要内存来创建实例并将实例呈现给用户。

当Android显示Dialog时,将调用一些本机函数以将Dialog绘制到屏幕上。

但是当您关闭对话框时,说Android也清除了他所有的本地缓存。

系统假定您一次显示一个对话框后,可能要在此之后显示另一个对话框。它将为此缓存一些本机实例。这样系统可以在下一次更快地显示对话框。

当需要内存时,Android会清除此缓存,但是如果有足够的内存,系统应该执行此操作。

,

不太确定,但我会假设它是因为每次您调用onclick方法时都在创建一个新对象。

AlertDialog.Builder dlgBuilder = new AlertDialog.Builder(this);
,

这不一定意味着存在泄漏。也许gc尚未决定要收集哪些对象。您可以自己在onResume中启动gc并测试对象是否被GC。 LeakCanary对检测内存泄漏非常有用,您可以通过添加依赖项来安装它。也可以使用LeakCanary检查您的代码,然后如果有泄漏,则可以轻松地跟踪泄漏。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...