Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android中的上下文单例_Java_Android_Singleton - Fatal编程技术网

Java Android中的上下文单例

Java Android中的上下文单例,java,android,singleton,Java,Android,Singleton,我想创建一个可以从应用程序中的所有点调用的单例类。问题是这个类的操作需要一个上下文 我不想在每个活动中都重新创建singleton,因为这样它就失去了所有意义,所以我考虑在MainActivity中创建它,使用init方法将上下文作为参数传递。从那时起,我的单例就可以使用了,但我认为这是一个糟糕的设计,因为这样我的MainActivity引用将始终保持不变,因此我可能会遇到内存泄漏 我在这里吗?由于内存泄漏,您没有将主活动上下文保存到单例中是正确的。如果单例中需要常量上下文,请使用getAppl

我想创建一个可以从应用程序中的所有点调用的单例类。问题是这个类的操作需要一个上下文

我不想在每个活动中都重新创建singleton,因为这样它就失去了所有意义,所以我考虑在MainActivity中创建它,使用init方法将上下文作为参数传递。从那时起,我的单例就可以使用了,但我认为这是一个糟糕的设计,因为这样我的MainActivity引用将始终保持不变,因此我可能会遇到内存泄漏


我在这里吗?

由于内存泄漏,您没有将主活动上下文保存到单例中是正确的。如果单例中需要常量上下文,请使用getApplicationContext()。这是可以安全保存的。但请注意,此上下文不适用于大多数gui相关函数。在极少数情况下,您需要singleton中的活动级别上下文,将调用活动上下文传递给singleton的方法而不保存

尝试
WeakReference

私有WeakReference上下文;
公共静态同步OSController getInstance(上下文,整数){
if(minInstance==null){
mInstance=新的OsControler(上下文,数字);
}
回报率;
}
专用OsControler(上下文,整数){
this.context=新的WeakReference(context);
NUMERO=NUMERO;
}

如果我的单例对象是静态的,并且我持有对上下文的引用,那么该上下文永远不会被垃圾收集。如果我没弄错的话,这可能会导致内存泄漏。如果不是这样,请在你的答案上展开一点。内存泄漏?如果它是一个单例,那么它的实例变量只有一个引用。这是一个什么样的漏洞,即使是,它又有什么实际意义呢?好吧,在我初始化我的Singleton的活动中保留的所有资产将在整个应用程序执行过程中保留。例如,如果我在那里有一个大图像,它很容易填满我的内存,很快就会用完。@我以为你在传递上下文,而不是整个应用程序。你的意思是,如果我在init()方法上使用getApplicationContext(),我不会出现内存泄漏问题,而如果我直接传递活动引用(即init(this)),那就是我会遇到麻烦的时候了?@michelreau
这不仅仅是一个上下文。是的,当您将对活动上下文的引用保存到应用程序范围存储中的活动外部时,麻烦就会出现。这可以防止在需要时销毁活动,并导致各种不正确的上下文使用。
private WeakReference<Context> context;

public static synchronized OsControler getInstance(Context context, int numero) {
    if (mInstance == null) {
        mInstance = new OsControler(context, numero);
    }

    return mInstance;
}

private OsControler(Context context, int numero) {
    this.context = new WeakReference<>(context);
    NUMERO = numero;
}