Утечка памяти Android в статической переменной члена ресурса?

Безопасно ли иметь статическую ссылку на private static Resources mRes; в моем классе Utils, инициализируется следующим образом?

public static void init(Resources res) {
    mRes = res;
}
.. later in activity
Utils.init(getContext().getResources());

Мне кажется, это вызывает утечку памяти (журнал Eclipse Memory Analyzer ниже)

mOuterContext android.app.ContextImpl 
'- mContext android.content.res.Resources
  |- mRes class com.github.mikephil.charting.utils.Utils
  |- mResources android.app.LoadedApk
  |- mResources android.app.ContextImpl
  |- this$0 android.content.res.Resources$Theme
  |  '- referent java.lang.ref.FinalizerReference
  |     '- next java.lang.ref.FinalizerReference
  |        '- next java.lang.ref.FinalizerReference

Есть ли безопасные способы получить ссылку на класс Resources, который не пропускает всю активность?

2 ответа

Решение

Вот решение, используйте статическую ссылку вашего контекста приложения, хранящуюся в вашем приложении

public class MyApplication extends Application
{
    private static Context context;

    public static Resources getResourcesStatic()
    {
         return context.getResources();
    }

    @Override
    public void onCreate()
    {
        super.onCreate();
        this.context = this.getApplicationContext();
    }
}

Теперь просто позвоните MyApplication.getResourcesStatic() чтобы получить доступ к вашим ресурсам, где бы вы ни находились.

Оказалось, что в этом конкретном случае мне не нужны целые ресурсы в качестве статической переменной-члена - мне нужен только android.util.DisplayMetrics.

Поэтому я изменил код, чтобы иметь

public class Utils{
    private static DisplayMetrics mMetrics;

    public static void init(Resources res) {
        mMetrics=res.getDisplayMetrics();
  }

Это прекрасно работает, утечка памяти больше не обнаруживается. Тем не менее, оригинальный вопрос (статическая переменная Resources) по-прежнему актуален.

Другие вопросы по тегам