2

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

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 

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

ответ

1

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

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() чтобы получить доступ к ресурсам, где бы вы ни находились.

+0

В примере переменная-член контекста должна быть инициализирована как getApplicationContext() (вызвана в my onCreate()?) –

+0

Действительно, было бы лучше – ToYonos

0

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

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

public class Utils{ 
    private static DisplayMetrics mMetrics; 

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

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

Смежные вопросы