在我的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类,而不是泄漏整个活动?
答案 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();
}
工作正常,不再发现内存泄漏。然而,原始问题(静态资源变量)仍然有效。