在Android(Kotlin)中处理Singletons清理的推荐方式是什么?

问题描述:

当我通过后退键并重新输入时,我的Android应用程序出现了一些奇怪的问题,并且发现它们正在发生,因为我有2个Singleton类中的变量永远不会重新初始化(如果手动查杀,问题不会发生来自任务管理器的应用程序)。在Android(Kotlin)中处理Singletons清理的推荐方式是什么?

即使我明确地完成主要活动onBackPressed并且我可以看到onDestroy被调用后,Singleton仍然在内存中。

我决定在破坏我的Activity之前手动清理这些单例,问题是使用Kotlin我需要使它们的所有成员变量都为空(?),并且记住将null分配给它会很麻烦每一个变量,所以现在我选择来处理辛格尔顿的实例这样,只是让空整个实例,同时清洗:

class SingletonName { 

    companion object { 
     private var _instance: SingletonName ? = null 
     private var instance: SingletonName ? 
      get() { 
       if (_instance == null) { 
        _instance = SingletonName() 
       } 
       return _instance 
      } 
      set(value) { 
       _instance = value 
      } 

     @JvmStatic fun get(): SingletonName { 
      return instance!! //avoid having to deal with nullable value in client code 
     } 
    } 

    //need to make sure to call this before destroying main activity 
    fun cleanup() { 
     instance = null 
    } 
} 

客户使用:

SingletonName.get().somefunc() 

这些似乎比它更复杂应该,我知道这一点甚至不是线程安全的,但请记住,简单地使用'object'关键字而不是'class'将不起作用,因为它会阻止在我第二次运行应用程序时发生任何初始化(构造函数未被再次调用我不能强迫销毁实例)。

这让我觉得这可能是值得关注的Android依赖注入,但我觉得至少有一个单身真的需要在很多地方访问,所以它可能不是一个优雅的解决方案要么(可能需要将其重构为更小的功能)。

这里的主要问题是android处理破坏的方式,但我想我不能改变这种情况,如果应用程序活动已经被破坏,我没有看到任何理由为什么它保留非活动类的所有静态值。

问题是如何处理这种情况,无论使用何种语言?或者您认为这种情况下的最佳做法是什么?

编辑:其实我只是用Dagger 2做了一个测试,并且发生同样的问题,如果我使用@Provides和@Singleton,第二次启动应用程序时提供的对象上的成员变量的值不为null我想这需要明确处理,除非我缺少一些更多注释来告诉Dagger实例应该在应用程序生命周期结束时发布。

+0

你可以像'recreate'或东西的方法来重新初始化单 – Mibac

+0

整个方法看起来很奇怪。如果只有在Activity可见时才需要这个“singleton”,那么只需在Activity中创建一个对象即可。 –

+0

@ Miha_x*情是我需要整个应用程序的整个生命周期的单身人士,是的,我想在开始时重新创建将与最后清理相同,但问题是一样的,需要确保重置每个成员变量。 – PedroMVU

在科特林创建辛格尔顿是如下

采取以下作为一个例子

无需明确创建的类一样简单,只要做到以下

object MySingleton { 

     fun myFunction() { 

     } 
    } 

,并调用它像

MySingleton.myFunction() 

你读了更多关于kotlin f中的单身人士ROM的文档https://kotlinlang.org/docs/reference/object-declarations.html#object-declarations

+0

此代码中未创建单身人士。 – FWeigl

+0

@Ascorbin你确定你认识Kotlin吗?这就是Kotlin创建单身人士的方式。您可以检查Kotlin官方文档。 –

+0

哎呀,对不起!你是对的,我错过了对象关键字。您可以删除数据库内容(因为这里没有关系),请突出显示对象关键字并指向您发布的链接的特定部分:https://kotlinlang.org/docs/reference/object-declarations.html#object-declarations – FWeigl