Синглтон с контекстом в Android

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

Я не хочу воссоздавать синглтон в каждом действии, потому что таким образом он теряет весь смысл, поэтому я подумал о создании его в моей MainActivity, с помощью метода init, где я передаю контекст в качестве аргумента. С этого момента мой Синглтон будет полезен, но я думаю, что это плохой дизайн, потому что способ моей ссылки на MainActivity всегда будет проводиться, и поэтому я могу столкнуться с утечками памяти.

Я здесь?

2 ответов


вы правы, чтобы не сохранять основной контекст активности в синглтон из-за утечек памяти. Если вам нужен постоянный контекст внутри вашего синглтона, используйте getApplicationContext (). Это можно безопасно сохранить. Обратите внимание, что этот контекст не используется для большинства функций, связанных с gui. В редких случаях вам нужен контекст уровня активности внутри singleton, передайте вызывающий контекст активности методу singleton без сохранения


попробовать WeakReference<Context>:

private WeakReference<Context> context;

public static synchronized OsControler getInstance(Context context, int numero) {
    if (mInstance == null) {
        mInstance = new OsControler(context, numero);
    }

    return mInstance;
}

private OsControler(Context context, int numero) {
    this.context = new WeakReference<>(context);
    NUMERO = numero;
}