Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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();
    }
}