web-dev-qa-db-fra.com

Obtenir le contexte d'application à partir d'une classe singleton non active

Dans mon Android, j'ai une classe ImageAdapter dans laquelle je passe le contexte de l'application pour d'autres besoins.

public class ImageAdapter extends BaseAdapter {
    private Context c;

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

Le problème est que je veux faire d'ImageAdapter un singleton pour avoir un accès facile à l'instance de cette classe à partir de toutes mes activités. Mais je ne sais pas comment passer le contexte d'application de la méthode getApplicationContext () d'une de mes activités à ImageAdapter. Y a-t-il donc une "magie" pour faire cela comme suit?

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;
    }
    ...
}

Vous avez peut-être d'autres idées pour partager ImageAdapter pour l'une de mes activités. Je suis un débutant à Android et je suis un peu confus avec les façons de transmettre des données entre les activités.

Je serai reconnaissant pour toute aide.

35
Dmitry

Mise à jour: 06-mars-18

Utilisez l'instance MyApplication au lieu de l'instance Context. Application instance est une instance de contexte singleton elle-même.

public class MyApplication extends Application {

    private static MyApplication mContext;

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

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

Réponse précédente

Vous pouvez obtenir le contexte d'application comme ceci:

public class MyApplication extends Application {

    private static Context mContext;

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

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

Ensuite, vous pouvez appeler le contexte d'application à partir de la méthode MyApplication.getContext()

N'oubliez pas de déclarer l'application dans votre fichier manifeste:

<application
    Android:name=".MyApplication"
    Android:icon="@drawable/icon"
    Android:label="@string/app_name" >
84
mohammed momn

Je préfère passer une instance de contexte en tant que paramètre à chaque méthode de singleton qui en a vraiment besoin

7
Micik

APPROCHE # 1:

Puisque vous spécifiez que ImageAdapter est un singleton, une réponse simple consiste à créer ce singleton à partir d'une classe ayant accès au contexte de l'application:

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;
    }
}

APPROCHE # 2:

S'il ne s'agissait pas d'un singleton, j'utiliserais la réponse acceptée. Dans ce cas, supprimez la variable locale d'ImageAdapter, car le contexte peut toujours être obtenu à partir de MyApplication. En développant la réponse acceptée, si vous voulez une méthode locale comme commodité, définissez ImageAdapter.getContext (). Solution complète:

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();
    }
}
2
ToolmakerSteve