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(); 
    } 

这工作正常,内存泄漏是不会再被发现。不过,原始问题(静态资源变量)仍然有效。