【问题标题】:Does the first MapActivity instance always leak?第一个 MapActivity 实例是否总是泄漏?
【发布时间】: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


【解决方案1】:

也许你应该和 NickT here交换笔记

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-25
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多