首页 文章

Kotlin Singleton应用类

提问于
浏览
29

所以在android中我想让我的应用程序类成为单例 .

像这样:

object MyApplication: Application(){}

不行 . 在运行时抛出以下错误:

java.lang.IllegalAccessException: private com....is not accessible from class android.app.Instrumentation.

这样做也是不可能的:

class MyApp: Application() {

    private val instance_: MyApp

    init{
        instance_ = this
    }

    override fun onCreate() {
        super.onCreate()
        if (BuildConfig.DEBUG) {
            Timber.plant(Timber.DebugTree());
        }
    }

    companion object{
        fun getInstance() = instance_         
    }
}

那么我怎样才能在我的应用程序中的任何地方获得我的应用程序类的实例,想使用 MyApp.instance() 而不是 (applicationContext as MyApp) .

还解释了为什么我想要这个:我在我的应用程序中有类,例如,使用上下文初始化的SharedPreference Singleton,并且作为它的单例,不能有参数 .

4 回答

  • 29

    如果你想要 use it to access some static properties :你只有一个你的应用程序实例,所以只需使用你给这个类的名字 . 不要担心它不是一个真正的单身人士,你可以用同样的方式使用它 .

    例:

    class MyApp : Application() {
    
        companion object {
            const val CONSTANT = 12
            lateinit var typeface: Typeface
        }
    
        override fun onCreate() {
            super.onCreate()
            typeface = Typeface.createFromAsset(assets, "fonts/myFont.ttf")
        }
    
    }
    

    然后,您可以在应用中的任何位置使用 MyApp.CONSTANTMyApp.typeface .

    如果您想要的是 to use it as an application context ,您可以为Context创建扩展属性:

    val Context.myApp: MyApp
            get() = applicationContext as MyApp
    

    然后,您可以使用 myApp 在任何有上下文的位置获取应用程序上下文 .

  • 3

    您可以执行与在Java中执行的操作相同的操作,即将 Application 实例放在静态字段中 . Kotlin没有静态字段,但对象中的属性是静态可访问的 .

    class MyApp: Application() {
    
        override fun onCreate() {
            super.onCreate()
            instance = this
        }
    
        companion object {
            lateinit var instance: MyApp
                private set
        }
    }
    

    然后,您可以通过 MyApp.instance 访问该 properties .

  • 62
    class AppController : Application() {
    
            init {
                instance = this
            }
    
            companion object {
                private var instance: AppController? = null
    
                fun applicationContext() : AppController {
                    return instance as AppController
                }
            }
    
            override fun onCreate() {
                super.onCreate()
            }
        }
    
  • 9

    您不能这样做,因为Android使用其无参数构造函数创建 Application 实例 .

    您想要解决的问题可以通过DI轻松解决 . 只需使用注入器创建实例,以便 Context 可以作为依赖项注入对象 .

相关问题