java - patron - Obtener contexto de aplicación de la clase singleton no actividad
patrones de diseño java (3)
En mi proyecto de Android, tengo la clase ImageAdapter en la que paso el contexto de la aplicación para algunas necesidades adicionales.
public class ImageAdapter extends BaseAdapter {
private Context c;
public ImageAdapter(Context c) {
this.c = c;
}
...
}
El problema es que quiero hacer ImageAdapter como singleton para tener un acceso fácil a la instancia de esta clase desde todas mis actividades. Pero no tengo idea de cómo pasar el contexto de la aplicación del método getApplicationContext () de una de mis actividades a ImageAdapter. Entonces, ¿hay alguna "magia" para hacer eso de la siguiente manera?
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;
}
...
}
Tal vez tengas otras ideas para compartir ImageAdapter para cualquiera de mis actividades. Soy un novato en Android y estoy un poco confundido con las formas de pasar datos entre actividades.
Estaré agradecido por cualquier ayuda.
ENFOQUE # 1:
Ya que especifica que ImageAdapter es un singleton, una respuesta simple es crear ese singleton desde una clase que tenga acceso al contexto de la aplicación:
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;
}
}
ENFOQUE # 2:
Si no fuera un singleton, entonces usaría la respuesta aceptada. En ese caso, elimine la variable local de ImageAdapter, porque el contexto siempre puede obtenerse desde MyApplication. Ampliando la respuesta aceptada, si desea un método local como una conveniencia, defina ImageAdapter.getContext (). Solución completa:
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();
}
}
Prefiero pasar una instancia de contexto como parámetro a cada método en singleton que realmente lo necesita
Actualización: 06-Mar-18
Utilice la instancia de MyApplication
lugar de la instancia de Context
. Application
instancia de la Application
es una instancia de contexto de singleton.
public class MyApplication extends Application {
private static MyApplication mContext;
@Override
public void onCreate() {
super.onCreate();
mContext = this;
}
public static MyApplication getContext() {
return mContext;
}
}
Respuesta anterior
Puede obtener el contexto de la aplicación de esta manera:
public class MyApplication extends Application {
private static Context mContext;
@Override
public void onCreate() {
super.onCreate();
mContext = getApplicationContext();
}
public static Context getContext() {
return mContext;
}
}
Luego, puede llamar al contexto de la aplicación desde el método MyApplication.getContext()
No olvide declarar la aplicación en su archivo manifiesto:
<application
android:name=".MyApplication"
android:icon="@drawable/icon"
android:label="@string/app_name" >