5

假设我有用于通用 LocationController、BatteryController、AppSateController 等的带有初始化方法的单例...

这些是否应该在 onResume 中而不是 OnCreate 中,因为 OnCreate 在每次旋转时被调用,每次更改为前景时等等......?

4

2 回答 2

16

我的建议通常是像通常那样直接实现单例。忽略 Android,只做如下正常的事情:

class Singleton {
    static Singleton sInstance;

    static Singleton getInstance() {
        // NOTE, not thread safe!  Use a lock if
        // this will be called from outside the main thread.
        if (sInstance == null) {
            sInstance = new Singleton();
        }
        return sInstance;
    }
}

现在在您需要的时候调用 Singleton.getInstance()。您的单例将在此时被实例化,并且只要您的进程存在,就会继续重复使用。这是一个很好的方法,因为它允许你的单例被延迟分配(仅在需要时),而不是为你可能不需要的东西做一堆前期工作,从而导致你的启动(从而响应用户)受苦。它还有助于保持你的代码更干净,关于你的单例及其管理的所有内容都位于它自己的位置,并且不依赖于正在运行的应用程序中的某个全局位置来初始化它。

此外,如果您在单例中需要上下文:

class Singleton {
    private final Context mContext;

    static Singleton sInstance;

    static Singleton getInstance(Context context) {
        // NOTE, not thread safe!  Use a lock if
        // this will be called from outside the main thread.
        if (sInstance == null) {
            sInstance = new Singleton(context);
        }
        return sInstance;
    }

    private Singleton(Context context) {
        // Be sure to use the application context, since this
        // object will remain around for the lifetime of the
        // application process.
        mContext = context.getApplicationContext();
    }
}
于 2013-02-24T09:00:37.703 回答
1

如果您需要初始化单例(我假设是应用程序级单例),那么适当的方法可能是扩展Application并在其onCreate()方法中提供所需的初始化。但是,如果初始化很繁重,最好将其放置在从 Application 类开始的单独线程中。

于 2013-02-24T05:18:43.580 回答