Утечка памяти 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) по-прежнему актуален.