Récupère le contexte de l'application à partir de la classe singleton non activity

Dans mon projet android, j'ai la 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 de toutes mes activités. Mais je n'ai aucune idée de comment passer le contexte de l'application de la méthode getApplicationContext () d'une de mes activités à ImageAdapter. Alors, y a-t-il 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;
    }
    ...
}

Peut-être avez-vous d'autres idées pour partage 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.

28
demandé sur Ram Koti 2014-02-17 04:45:01

3 réponses

Mise À Jour Le: 06-Mar-18

Utiliser MyApplication exemple au lieu de Context exemple. 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 de l'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 de l'application de la méthode MyApplication.getContext()

N'oubliez pas de déclarer la demande dans votre fichier manifeste:

<application
    android:name=".MyApplication"
    android:icon="@drawable/icon"
    android:label="@string/app_name" >
70
répondu mohammed momn 2018-03-06 11:18:33

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

5
répondu Micik 2014-02-17 00:57:24

Approche # 1:

Puisque vous spécifiez que ImageAdapter est un singleton, une réponse simple consiste à créer ce singleton à partir d'une classe qui a 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:

Si ce n'était pas un singleton, alors j'utiliserais la réponse acceptée. Dans ce cas, supprimez la variable locale de 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 par 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();
    }
}
3
répondu ToolmakerSteve 2015-10-08 03:31:58