Android

Get application context from non activity singleton class

Получение контекста приложения из бездействующего одноэлементного класса

В моем Android-проекте у меня есть класс ImageAdapter, в котором я передаю контекст приложения для некоторых дальнейших нужд.

public class ImageAdapter extends BaseAdapter {
private Context c;

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

Проблема в том, что я хочу создать ImageAdapter как одноэлементный, чтобы иметь легкий доступ к экземпляру этого класса из всех моих действий. Но я понятия не имею, как передать контекст приложения из метода getApplicationContext () из одного из моих activities в 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, и меня немного смущают способы передачи данных между действиями.

Я буду благодарен за любую помощь.

Переведено автоматически
Ответ 1

Обновление: 06-18 марта

Используйте MyApplication instance вместо Context экземпляра. Application instance сам по себе является экземпляром одноэлементного контекста.

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" >
Ответ 2

Я бы предпочел передавать экземпляр контекста в качестве параметра каждому методу в singleton, которому это действительно нужно

Ответ 3

ПОДХОД № 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();
}
}
java android