【问题标题】:Android AlertDialog leaks memory when show & dismiss multiple times?Android AlertDialog 在多次显示和关闭时泄漏内存?
【发布时间】:2023-12-31 12:52:01
【问题描述】:

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

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>

我多次点击按钮&空白区域后,内存是这样的:

主要是Native memory增长了~3.6MB,无法进行GC...这是为什么呢?

【问题讨论】:

    标签: android memory memory-leaks android-alertdialog


    【解决方案1】:

    没有内存泄漏!

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

    当 Android 显示 Dialog 时,会调用一些原生函数将 Dialog 绘制到屏幕上。

    但是当你关闭一个对话框时说Android也会清除他所有的本地缓存。

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

    当需要内存时,Android 会清除这些缓存,但系统是否应该在内存足够时执行此操作。

    【讨论】:

      【解决方案2】:

      不完全确定,但我认为是因为每次调用 onclick 方法时,您都在创建一个新对象。

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

      【讨论】:

      • 我知道每次点击按钮都会创建一个新对象,但是当对话框被关闭时Builder不能是GC吗?
      【解决方案3】:

      这并不一定意味着存在泄漏。也许 gc 还没有决定收集哪些对象。您可以自己在 onResume 中启动 gc 并测试对象是否被 GC。 LeakCanary 对于检测内存泄漏非常有用,您只需添加依赖项即可安装它。也可以使用 LeakCanary 检查您的代码,如果有泄漏,您可以轻松追踪。

      【讨论】:

      • 你试过我贴的代码了吗?你能在你的设备上检查一下我是对还是错?
      • 我调查了这件事。似乎内存使用量随着多次显示对话框而增加,但正如我用 LeakCanary 测试过的那样,没有内存泄漏。也许分配的内存每次都会增加,但您可以确定您共享的代码中没有内存泄漏(一个按钮和一个简单的对话框)。
      • 当您像我一样运行此应用并单击按钮时,您的记忆如何?你能贴一下你的 profiler-memory 的图片吗?
      最近更新 更多