2016-05-23 44 views
15

所以在android中,我想让我的应用程序类是一个单身人士。Kotlin SingleTon应用程序类

使其像这样:

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用上下文初始化,并且作为其单例,不能有参数。

回答

15

如果你想使用它来访问你有的一些静态属性:你将只有一个你的应用程序的实例,所以只需使用你给这个类的名字。不要担心它不是一个真正的单身人士,你可以用同样的方式。

例子:

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

-

如果你想要的是使用它作为一个应用程序上下文您可以创建上下文的扩展属性:

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

然后你就可以使用myApp得到的应用程序上下文在任何地方。

+0

这看起来不错@nitrico,但我无法获得'val Context.myApp:MyApp get()= applicationContext作为MyApp的部分工作。你可以进一步了解更多细节吗?这条线路需要去哪里以及如何在另一个班级访问? – shredder

2

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

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

+0

你我一直知道这个解决方案,但希望有另一种方式。感谢的人 –

29

你可以做同样的事情你会用Java做,即将Application实例放在一个静态字段中。 Kotlin没有静态字段,但对象中的属性是静态可访问的。

class MyApp: Application() { 

    override fun onCreate() { 
     super.onCreate() 
     instance = this 
    } 

    companion object { 
     lateinit var instance: MyApp 
      private set 
    } 
} 

然后,您可以通过MyApp.instance访问该属性。