如何避免这里的内存泄漏?

时间:2019-12-15 12:42:57

标签: android memory-leaks singleton android-context

我正在创建一个模块(一组用于执行功能的类),在该模块中,我需要上下文对象来执行一些操作,例如安全设置读取和其他操作。

我不喜欢为我的类创建多个对象,在我的情况下,理想情况下甚至不需要这样做,所以我正在做类似的事情,

class MyModuleFactory {

    private static final String TAG = MyModuleFactory.class.getSimpleName();
    public Context mContext;
    private static HashMap<Context, MyModuleFactory> myInstance = new HashMap<>();

    private MyModuleFactory(Context context) {
        mContext = context;
    }

    public static synchronized MyModuleFactory getInstance(Context mContext) {
        if(mContext == null) {
            Log.i(TAG, "Context cannot be null");
            return null;
        }
        if(myInstance.get(mContext.getApplicationContext()) != null) {
            return myInstance.get(mContext.getApplicationContext());
        } else {
            MyModuleFactory myModuleFactory = new MyModuleFactory(mContext);
            myInstance.put(mContext.getApplicationContext(), myModuleFactory);
        }
    }
}

我这里的担心是因为我在这里保存了应用程序的上下文,所以我担心会导致内存泄漏-原因是因为Android可以随时清除应用程序对象并重新创建它。因此,将上下文保留在应用程序生命周期的背后并不允许在此处清除上下文可能会导致内存泄漏。

在这里为模块强制单例并避免内存泄漏的更好方法是什么。

1 个答案:

答案 0 :(得分:1)

如果持有对应用程序上下文的引用,则不会发生任何内存泄漏。只要应用程序正在运行,应用程序上下文就一直存在。当应用被杀死时,它将被销毁。在这种情况下,即使您的单身人士也将被销毁,因此不会发生内存泄漏。

只需确保您仅在单例中保留对Application上下文的引用,而不对Activity上下文具有引用。

检查this post以获得详细信息:

  

如果必须为应用程序创建一个单例对象,并且   对象需要上下文,请始终通过应用程序上下文。

     

如果在此处传递活动上下文,将导致内存泄漏   因为它将保留对活动的引用,而活动将不会   垃圾收集。