从任何地方访问上下文?全局上下文?

3
我有一个应用程序需要在许多不同的类中一直访问上下文,以保存和序列化数据、显示对话框等。
根据Android开发者网站上的一篇文章,这会导致内存泄漏:http://developer.android.com/resources/articles/avoiding-memory-leaks.html 访问上下文的一般方法是什么?我应该创建一个单例类,在应用程序启动时持有一个上下文引用,还是有更好的方法?
例如,我的方法现在看起来像这样:
public void saveData(TheCassName classObject, Context context){
//do some stuff that involves context
}

而且可以从任何需要它的地方调用。

谢谢!


2个回答

3

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

在您的应用程序中扩展并使用应用程序上下文,通过在其中创建静态变量来实现。

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>

2
这不是内存泄漏的一个例子吗?因为静态变量将保存对应用程序上下文的引用,所以它永远无法被垃圾回收。或者我理解错了吗? - Niklas Ekman
是的,你完全错了。这是一种正确的保持应用程序上下文的方式。由于应用程序是一个进程,只要进程保持活动状态,它的上下文就可用。这就是为什么你不能泄漏这个特定的上下文——它仅仅因为框架设计而比其他所有东西都更长久存在。 - Drew
如果您使用Activity作为上下文而不是这个上下文,那么您将会泄漏内存。如果该Activity已经完成,则它将准备好被垃圾回收。但是,如果有人指向它,那么Java将保留该内存,然后您将生成内存泄漏。 - Joaquin Iurchuk

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接