【问题标题】:Android memory leak on static Resource member variable?静态资源成员变量上的Android内存泄漏?
【发布时间】:2014-12-06 12:08:20
【问题描述】:

在我的 Utils 类中静态引用private static Resources mRes; 是否安全,初始化如下?

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

是否有安全的方法来获取资源类的引用,而不是泄漏整个活动?

【问题讨论】:

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


    【解决方案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() 即可随时随地访问您的资源。

    【讨论】:

    • 在示例中,上下文成员变量应初始化为 getApplicationContext() (在我的 onCreate() 中调用?)
    • 确实会更好
    【解决方案2】:

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

    所以我把代码改成了有

    public class Utils{
        private static DisplayMetrics mMetrics;
    
        public static void init(Resources res) {
            mMetrics=res.getDisplayMetrics();
      }
    

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

    【讨论】:

      猜你喜欢
      • 2011-12-01
      • 1970-01-01
      • 2013-11-06
      • 2012-09-29
      • 1970-01-01
      • 2012-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多