2

如何在我的Utils類中靜態引用private static Resources mRes;是否安全?靜態資源成員變量上的Android內存泄漏?

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

在我看來,它會導致內存泄漏(對數從下面的Eclipse內存分析器)

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()初始化(在我的onCreate()中調用?) – 2014-10-11 13:13:16

+0

事實上,它會更好 – ToYonos 2014-10-11 13:17:19

0

原來,在這種特殊情況下,我不需要整個資源作爲靜態成員變量 - 我只需要android.util.DisplayMetrics。

因此,我改變代碼有

public class Utils{ 
    private static DisplayMetrics mMetrics; 

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

這工作正常,內存泄漏是不會再被發現。不過,原始問題(靜態資源變量)仍然有效。