在Android应用中,以下方法是否存在问题:

public class MyApp extends android.app.Application {

    private static MyApp instance;

    public MyApp() {
        instance = this;
    }

    public static Context getContext() {
        return instance;
    }

}

并在需要上下文的地方传递它(例如SQLiteOpenHelper)(当然不泄漏)?


当前回答

我使用同样的方法,我建议把单例写得更好一点:

public static MyApp getInstance() {

    if (instance == null) {
        synchronized (MyApp.class) {
            if (instance == null) {
                instance = new MyApp ();
            }
        }
    }

    return instance;
}

但我不是到处使用,我使用getContext()和getApplicationContext(),我可以这样做!

其他回答

这种方法有几个潜在的问题,尽管在很多情况下(比如您的例子)它会工作得很好。

特别是在处理任何需要Context的GUI时,都应该非常小心。例如,如果你将应用Context传递给LayoutInflater,你会得到一个Exception。一般来说,您的方法是优秀的:在活动中使用活动的上下文,在传递超出活动范围的上下文时使用应用程序上下文,以避免内存泄漏,这是一个很好的实践。

此外,作为模式的替代方法,您可以使用在上下文对象(例如活动)上调用getApplicationContext()的快捷方式来获取应用程序上下文。

根据我的经验,这种方法是不必要的。如果你需要任何东西的上下文,你通常可以通过调用View.getContext()来获得它,并使用在那里获得的上下文,你可以调用context. getapplicationcontext()来获得应用程序上下文。如果你试图从一个活动中获得应用程序上下文,你总是可以调用Activity. getapplication(),它应该能够作为调用SQLiteOpenHelper()所需的上下文传递。

总的来说,在这种情况下,你的方法似乎没有问题,但当处理Context时,请确保你没有泄漏内存,就像官方谷歌Android开发者博客上描述的那样。

您正在尝试创建一个包装器来获取应用程序上下文,它可能会返回“null”指针。

根据我的理解,我猜更好的方法是调用- 2中的任何一个 Context.getApplicationContext()或Activity.getApplication()。

我知道最初的问题是13年前发布的,这是Kotlin版本的无处不在的上下文。

class MyApplication : Application() {
    companion object {
        @JvmStatic
        private var instance: MyApplication? = null

        @JvmStatic
        public final fun getContext(): Context? {
            return instance
        }
    }

    override fun onCreate() {
        instance = this
        super.onCreate()
    }
}

我喜欢它,但我建议改用单例:

package com.mobidrone;

import android.app.Application;
import android.content.Context;

public class ApplicationContext extends Application
{
    private static ApplicationContext instance = null;

    private ApplicationContext()
    {
        instance = this;
    }

    public static Context getInstance()
    {
        if (null == instance)
        {
            instance = new ApplicationContext();
        }

        return instance;
    }
}