静态资源成员变量上的Android内存泄漏?

时间:2014-10-11 11:55:48

标签: android memory-leaks resource-leak eclipse-memory-analyzer

在我的Utils类中对private static Resources mRes;进行静态引用是否安全,如下所示?

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 个答案:

答案 0 :(得分: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()即可随时随地访问您的资源。

答案 1 :(得分:1)

事实证明,在这个特殊情况下,我不需要整个资源作为静态成员变量 - 我只需要android.util.DisplayMetrics。

所以我改变了代码

public class Utils{
    private static DisplayMetrics mMetrics;

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

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