问题描述
我有一个简单的活动,只有一个按钮可以弹出一个简单的对话框。代码是:
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>
主要,本机内存增长了〜3.6MB ,这不能是GC ...为什么?
解决方法
没有内存泄漏!
是的,当显示对话框时,内存使用增加了,因为它需要内存来创建实例并将实例呈现给用户。
当Android显示Dialog时,将调用一些本机函数以将Dialog绘制到屏幕上。
但是当您关闭对话框时,说Android也清除了他所有的本地缓存。
系统假定您一次显示一个对话框后,可能要在此之后显示另一个对话框。它将为此缓存一些本机实例。这样系统可以在下一次更快地显示对话框。
当需要内存时,Android会清除此缓存,但是如果有足够的内存,系统应该执行此操作。
,不太确定,但我会假设它是因为每次您调用onclick方法时都在创建一个新对象。
AlertDialog.Builder dlgBuilder = new AlertDialog.Builder(this);
,
这不一定意味着存在泄漏。也许gc尚未决定要收集哪些对象。您可以自己在onResume中启动gc并测试对象是否被GC。 LeakCanary对检测内存泄漏非常有用,您可以通过添加依赖项来安装它。也可以使用LeakCanary检查您的代码,然后如果有泄漏,则可以轻松地跟踪泄漏。