gpt4 book ai didi

android - 关于 Romain Guy 的 Avoid memory leaks on Android

转载 作者:搜寻专家 更新时间:2023-11-01 08:00:20 24 4
gpt4 key购买 nike

我是 android 开发的新手,我刚刚从以下链接阅读了 Romain Guy 的“避免 Android 上的内存泄漏”

http://www.curious-creature.org/2008/12/18/avoid-memory-leaks-on-android/

然后我在我的安卓模拟器上用他著名的代码 fragment 做了一点测试

private static Drawable drawable;

private StringBuilder sb;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

TextView label = new TextView(this);
label.setText("Leaks are bad");

if (drawable == null) {
drawable = getResources().getDrawable(R.drawable.ic_launcher);
}

sb = new StringBuilder();

for (int i = 0; i < 1024; i++) {
sb.append('a');
}

label.setCompoundDrawables(null, drawable, null, null);

setContentView(label);
}

这段代码应该在改变方向时泄漏第一个 Activity 上下文。所以我在模拟器中运行程序并更改一次方向(我还打印了 2 个 Activity 上下文 ca.welcomelm.leaktest.MainActivity@45f81f98 和 ca.welcomelm.leaktest.MainActivity@45f8d6f8).然后我转储 HPROF 并通过传入引用 char[] 跳转到列表对象。我虽然应该看到 2 个 char[],其模式为“aaaaaaaaaaaa...”,它们由这 2 个 Activity 上下文引用。但我发誓我只看到第二个上下文引用了一个。泄漏的上下文不存在。我认为这是GCed。其他人可以证实这一点吗?谢谢

最佳答案

改变:

if (drawable == null) {
drawable = getResources().getDrawable(R.drawable.ic_launcher);
}

类似于:

if (drawable == null)
drawable = getResources().getDrawable(R.drawable.ic_launcher);
else
Log.i("blablabla", "Drawable initialized in prior activity");

然后开始进行屏幕旋转。您会注意到 Log.i 将启动,因为可绘制对象被标记为 static 并且已经在之前的 Activity 中初始化。这是内存泄漏开始的地方。

由于现代设备的内存资源非常庞大,因此您不会轻易注意到此类泄漏。但是,如果您的应用程序包含大量此类引用或在低端设备上运行,那么您可能很幸运很快就会遇到内存泄漏。

关于android - 关于 Romain Guy 的 Avoid memory leaks on Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22151555/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com