【问题标题】:Context memory leaks in androidandroid中的上下文内存泄漏
【发布时间】:2014-08-27 06:21:36
【问题描述】:

我在开发者博客上阅读了有关上下文内存泄漏的信息。

http://android-developers.blogspot.de/2009/01/avoiding-memory-leaks.html

但我不确定我是否理解它。

方法getAppVersion会不会因为上下文引用而导致内存泄漏?

public class A
{

public static int getAppVersion(Context context) {
        try {
            PackageInfo packageInfo = context.getPackageManager()
                    .getPackageInfo(context.getPackageName(), 0);
            return packageInfo.versionCode;
        } catch (NameNotFoundException e) {
            // should never happen
            throw new RuntimeException("Could not get package name: " + e);
        }
    }

}

public class B extends Activity
{

@Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.b);

       int version = A.getAppVersion(this);

}

}

【问题讨论】:

  • 如果您将活动上下文保存在静态字段中,则不会发生内存泄漏。在你的情况下,你不这样做。
  • 并且getAppVersion 仅在方法执行时保存对context 的引用。之后它被移除并且不再“活着”。
  • 只是避免将任何绑定到上下文本身的上下文的 Android 组件。您必须了解 Android 中的几乎所有内容都是托管的,因此不要对您不能 100% 确定的任何内容做出任何假设。经验法则基本上是您留在 Android 的生命周期中,并将您自己变量的范围与它们匹配。

标签: java android memory-leaks


【解决方案1】:

上下文内存泄漏怎么办 - 同意之前所说的,这是帮助我在应用程序中避免它们的方法:

  • 避免将静态变量用于视图或与上下文相关的引用。
  • 将上下文相关的引用传递给 Singleton 类。
  • 尽可能使用 applicationContext() 代替活动上下文或查看上下文。例如,对于 Toasts、Snackbars。
  • 在需要时使用上下文相关引用的弱引用。

这里有更多关于这些案例的详细信息https://www.symphony-solutions.eu/fixing-memory-leaks-in-android/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    相关资源
    最近更新 更多