【问题标题】:Access context from anywhere? Global context?从任何地方访问上下文?全球背景?
【发布时间】:2011-10-19 20:52:44
【问题描述】:

我有一个应用程序需要一直访问许多不同类中的上下文,用于保存和序列化数据、显示对话框等。

根据 Android 开发者网站上的一篇文章,这会导致内存泄漏: http://developer.android.com/resources/articles/avoiding-memory-leaks.html

访问上下文的一般方法是什么?是否应该创建一个单例类,该类在应用启动后立即保存一个对上下文的引用,或者最好的方法是什么?

例如,现在我的方法看起来像这样

public void saveData(TheCassName classObject, Context context){
//do some stuff that involves context
}

并且从我需要的任何地方调用。

谢谢!

【问题讨论】:

标签: android


【解决方案1】:

只是为了澄清:没有内存泄漏,因为正在保存的上下文是应用程序的一部分,它是一个只有在应用程序关闭时才会被杀死的进程。

在您的应用程序中扩展应用程序,然后通过以下方式使用应用程序上下文 在其中制作静态变量。

public class MyApp extends Application {

    private static Context context;

    public void onCreate() {
        super.onCreate();
        MyApp.context = getApplicationContext();
    }

    public static Context getAppContext() {
        return MyApp.context;
    }
}

您还需要在清单中定义应用程序。

<manifest>
  <application android:name="com.abc.MyApp">

  </application>
</manifest>

【讨论】:

  • 这不是内存泄漏的例子吗?由于静态变量将持有对应用程序上下文的引用,因此它永远无法正确地被垃圾收集。还是我理解错了?
  • 是的,你搞错了。这是保持应用程序上下文的正确方法。由于应用程序是一个进程,只要进程保持活动状态,它的上下文就可用。这就是为什么您不能泄露 this 特定上下文的原因——它只是通过框架设计比其他所有内容都更长寿。
  • 如果你使用 Activity 作为上下文而不是这个上下文,你会泄漏内存。如果该活动完成,那么它将准备好被垃圾收集。但是,如果有人指向它,那么 Java 会将其保留在内存中,然后您就会产生内存泄漏。
【解决方案2】:

尝试使用应用程序上下文而不是活动上下文。但是,您应该注意应用上下文的限制:When to call activity context OR application context?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-29
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多