初始化逻辑(对于众多单身人士来说)应该是OnCreate还是OnResume?

时间:2013-02-24 05:11:58

标签: android

假设我有一个带有通用LocationController,BatteryController,AppSateController等的inilizations mehods的单身人士......

这些是否应该在onResume而不是OnCreate,因为OnCreate会在每次旋转时调用,每次更改为foregroud等等??

2 个答案:

答案 0 :(得分: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();
    }
}

答案 1 :(得分:1)

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