3

Is it safe to have static reference to private static Resources mRes; in my Utils class, initalized as follows?

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

It seems to me it causes memory leak (log from Eclipse Memory Analyzer below)

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

Are there safe ways to get reference to Resources class, that is not leaking whole activity?

4

2 回答 2

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()无论您身在何处,只需拨打电话即可访问您的资源。

于 2014-10-11T13:10:11.203 回答
1

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

所以我将代码更改为

public class Utils{
    private static DisplayMetrics mMetrics;

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

效果很好,不再发现内存泄漏。尽管如此,原始问题(静态资源变量)仍然有效。

于 2014-10-11T13:15:36.463 回答