从非活动单例类中获取应用程序上下文

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从非活动单例类中获取应用程序上下文相关的知识,希望对你有一定的参考价值。

在我的android项目中,我有ImageAdapter类,我在其中传递应用程序上下文以满足其他需求。

public class ImageAdapter extends BaseAdapter {
    private Context c;

    public ImageAdapter(Context c) {
            this.c = c;
    }
    ...
}

问题是我想让ImageAdapter成为一个单例,以便从我的所有活动中轻松访问这个类的实例。但是我不知道如何将getApplicationContext()方法中的app context从我的一个活动传递给ImageAdapter。所以有没有“神奇”做到这一点如下?

public class ImageAdapter extends BaseAdapter {

    private Context c;

    private static class Holder {
            public static final ImageAdapter IA = new ImageAdapter();
    }

    private ImageAdapter() {
            this.c = /* some magic here */.getApplicationContext();
    }

    public static ImageAdapter getInstance() {
            return Holder.IA;
    }
    ...
}

也许你有一些其他的想法,可以为我的任何活动分享ImageAdapter。我是android的新手,我对在活动中传递数据的方式有点困惑。

我将不胜感激任何帮助。

答案

更新:06年3月6日

使用MyApplication实例代替Context实例。 Application实例本身就是一个单例上下文实例。

public class MyApplication extends Application {

    private static MyApplication mContext;

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

    public static MyApplication getContext() {
        return mContext;
    }
}

上一个答案

您可以像这样获取应用程序上下文:

public class MyApplication extends Application {

    private static Context mContext;

    @Override
    public void onCreate() {
        super.onCreate();
        mContext = getApplicationContext();
    }

    public static Context getContext() {
        return mContext;
    }
}

然后,您可以从方法MyApplication.getContext()调用应用程序上下文

不要忘记在清单文件中声明应用程序:

<application
    android:name=".MyApplication"
    android:icon="@drawable/icon"
    android:label="@string/app_name" >
另一答案

我宁愿将一个上下文实例作为参数传递给单身实际需要它的每个方法

另一答案

方法#1:

由于您指定ImageAdapter是单例,因此一个简单的答案是从可以访问应用程序上下文的类创建该单例:

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        ImageAdapter.createIt(this);
    }
}

public class ImageAdapter extends BaseAdapter {
    private static ImageAdapter it;
    // Get the singleton.
    public static ImageAdapter getIt() {
        return it;
    }
    // Call this once, to create the singleton.
    public static void createIt(Context context) {
        it = new ImageAdapter(context);
    }

    private final Context c;
    private ImageAdapter(Context context) {
        c = context;
    }
}

方法#2:

如果它不是单身人士,那么我会使用接受的答案。在这种情况下,从ImageAdapter中删除局部变量,因为始终可以从MyApplication获取上下文。扩展已接受的答案,如果您希望本地方法为方便,请定义ImageAdapter.getContext()。完整解决方案

public class MyApplication extends Application {
    private static Context appContext;
    public static Context getContext() {
        return appContext;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        appContext = this;
    }
}

public class ImageAdapter extends BaseAdapter {
    public ImageAdapter() {
    }

    // [Optional] Call this whenever you want the app context.
    private Context getContext() {
        return MyApplication.getContext();
    }
}

以上是关于从非活动单例类中获取应用程序上下文的主要内容,如果未能解决你的问题,请参考以下文章

从非活动类中获取上下文

在打开的单例类中调用单例类方法

如何快速创建单例类? [复制]

是否需要在单例类中使用弱引用?

基于外部单例类中的属性的 SwiftUI 显示表

单例模式的坑