【发布时间】:2011-02-24 21:59:17
【问题描述】:
在我们的应用程序中调查内存问题时,事实证明,如果应用程序 Activity 是 MapActivity,它的第一个实例将不会最终确定。导致其他内存泄漏,例如传递给 setContentView 的视图。
以前有人注意到吗?
这里的测试代码显示“MainActivity : 1”没有最终确定,而 MainActivity 继承自 Activity。
要进行测试,需要多次更改设备或模拟器方向。
import com.google.android.maps.MapActivity;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends MapActivity {
private static final String defaultTag = "MA";
private static final boolean isDebugModeActivate = true;
private static final boolean isClassTagDisplayed = false;
private static final boolean isWebModeActivate = false;
static public void d(Object thiso, String message)
{
String tag = defaultTag + (isClassTagDisplayed == true ? "_" + thiso.getClass().getSimpleName() : "");
message = (isClassTagDisplayed == false ? thiso.getClass().getSimpleName() + " : " : "") + message;
Log.d(tag, message);
}
public MainActivity()
{
counter++;
uid++;
id = uid;
d(this, id + " tst constructor (" + counter + ")");
}
private static int counter = 0;
private static int uid = 0;
private final int id;
protected void finalize() throws Throwable
{
counter--;
d(this, id + " tst finalize (" +counter + ") ");
super.finalize();
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
protected boolean isRouteDisplayed()
{
return false;
}
}
谢谢你, 大卫
【问题讨论】:
-
你不是唯一一个在 android 上有泄漏问题的人:stackoverflow.com/questions/5111139/…
-
@Tyler,是的,我知道。由于我没有发现这个特定的内存泄漏,我想最好参考一下。至少这可以节省数小时的调查时间。
-
@david:很好的观察!我认为它比这更糟糕。我将您的代码粘贴到我的应用程序中,启动和停止了 4 次(肯定会通过 onDestroy)。记录了 4 个构造函数 - 没有终结器!我通过 DDMS 强制 GC 并记录了 finalizer(3),仅此而已。无论我强制 GC 多少次,都不再有终结器。
-
@NickT,是的,它在低端设备上非常糟糕。为了减少泄漏量,当调用 MapActivity.onDestory 时,我删除了传递给 MapActivity.setContentView 的所有视图子项。这会导致稍后发生潜在的 OutOfMemory 错误。
标签: android google-maps memory-leaks mapactivity