"令牌为空"使用单例进行上下文/活动

时间:2016-07-05 23:37:55

标签: android

我已经实现了一个单例类,以避免将Activity作为参数传递给每个方法/构造函数。

public class ApplicationContext {

    private static class Holder {
        private static final ApplicationContext INSTANCE = new ApplicationContext();
    }

    private ApplicationContext() {}

    private Context mContext;

    public static ApplicationContext getInstance(){
        return Holder.INSTANCE;
    }

    public Context getContext(){
        return Holder.INSTANCE.mContext;
    }


    public void setContext(Context mContext){
        Holder.INSTANCE.mContext = mContext;
    }
}

在我最初的活动中,我设置了上下文:

private void initializeObjects(){
    ApplicationContext.getInstance().setContext(getApplicationContext());
}

当我尝试在ProgressDialog中使用上下文时会出现问题:

@Override
protected void onPreExecute() {
    pd = ProgressDialog.show(context, "", "Salvando Usuário");
}

错误讯息:

07-05 20:29:46.413  30930-30930/com.test.app E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.test.app, PID: 30930
android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
        at android.view.ViewRootImpl.setView(ViewRootImpl.java:690)
        at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:289)
        at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85)
        at android.app.Dialog.show(Dialog.java:311)
        at android.app.ProgressDialog.show(ProgressDialog.java:116)

使用像我这样的单身人士是一个好习惯吗?怎么了?如果不是,那么什么是好的做法而是将上下文/活动传递给每个电话?

提前感谢。

1 个答案:

答案 0 :(得分:1)

对于AlertDialogs,您不能使用任何非Activity的上下文,因此如果您在片段中,请使用Activity.this或getActivity()之类的内容。

您仍然可以使用Application全局上下文来获取颜色和drawable以及其他内容,但是例如使用此上下文创建一个视图,主题将被忽略,因此请尽量使用Activity上下文。

顺便说一下,如果你想拥有一个可以访问上下文的单例,你应该在ApplicationContext中扩展Application类并覆盖onCreate方法,同时将这个ApplicationContext类添加到你的清单Application元素名。如果您使用该initializeObjects方法并从第一个活动中调用它,那么退出该活动时该上下文会发生什么?

以此为例:

public class ApplicationContext extends Application {

    private Context mContext;

    public static Context getContext(){
        return mContext;
    }

    @Override
    public void onCreate() {
       mContext = this;

       // you can initialize other stuff here if you want
    }

}

// manifest
<application
        android:name="com.example.ApplicationContext"

当应用程序运行时,它总是通过Application类的onCreate方法,它贯穿应用程序的整个生命周期。但不要滥用太多。