Получить контекст приложения из класса non activity singleton
В моем проекте андроида у меня есть класс ImageAdapter, в котором я передаю контекст приложения для некоторых дальнейших потребностей.
public class ImageAdapter extends BaseAdapter {
private Context c;
public ImageAdapter(Context c) {
this.c = c;
}
...
}
Проблема в том, что я хочу сделать ImageAdapter как singleton, чтобы иметь легкий доступ к экземпляру этого класса из всех моих действий. Но я не знаю, как передать контекст приложения из метода getApplicationContext() из одного из моих действий в 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 для любых моих действий.
Я новичок с андроидом, и я немного запутался в способах передачи данных между действиями.
Буду благодарен за любую помощь.
Ответы
Ответ 1
Вы можете получить контекст приложения следующим образом:
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" >
Ответ 2
Я предпочел бы передать экземпляр контекста в качестве параметра для каждого метода в singleton, который действительно нуждается в нем
Ответ 3
ПОДХОД № 1:
Поскольку вы указываете, что ImageAdapter является singleton, один простой ответ заключается в создании этого одноэлементного класса из класса, который имеет доступ к контексту приложения:
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();
}
}