当前位置: 首页 > 知识库问答 >
问题:

Kotlin单例应用程序类

壤驷乐邦
2023-03-14

因此,在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作为MyApp)

还有一个解释:我的应用程序中有类,例如,SharedReference单例,它是用上下文初始化的,作为单例,不能有参数。

共有3个答案

澹台昆
2023-03-14
    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()
        }
    }
洪飞白
2023-03-14

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

例子:

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。常量和MyApp。字体应用程序中的任意位置。

-

如果您想要将其用作应用程序上下文,则可以为Context创建扩展属性:

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

然后,您可以使用myApp在任何有上下文的地方获取应用程序上下文。

劳鹏云
2023-03-14

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

class MyApp: Application() {

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

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

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

 类似资料:
  • 问题内容: 我有一个facebook初始化sdk调用,启动应用程序时需要它来初始化: 我想使用我的Application类来做到这一点。例如: 我的主要活动是使用Facebook登录按钮: 我怎么称呼我的申请单身人士?我如何使其onCreate()工作? 问题答案: 要使您的App类遵循 Singleton设计模式 : 然后在其他任何类中使用它: 如果这是您要的..

  • 本文向大家介绍AngularJS教程之简单应用程序示例,包括了AngularJS教程之简单应用程序示例的使用技巧和注意事项,需要的朋友参考一下 按以下步骤来创建AngularJS应用  第1步:加载框架 作为一个纯粹的JavaScript框架,它可以使用<script>标签来添加。 第2步:使用ng-app指令定义AngularJS应用 第3步:用 ng-model指令定义的模式名称 <p>Ent

  • 我无法运行JavaFX-Kotlin应用程序。 我的初学者类 我不能将param“args”传递给“launch”方法,因为编译器说: 错误:(19,9)Kotlin:不能使用提供的参数调用以下函数:public open fun launch(p0:class!,vararg p1:string!):javafx.application.application中定义的单元public open

  • 有人能解释这两个SpringBean作用域之间的区别吗?我熟悉单例模式。 这是唯一的区别吗?使用application scope,您可以在Spring容器中拥有一个beans列表。 此外,您是否能够在一个Spring容器中运行多个Web服务器?如果是,那将是使用应用程序范围而不是单例范围的原因,因为否则bean将在两个服务器上共享。

  • 静态编程语言单例(更具体地说,对象声明)在结构上是线程安全的吗?如果不是,用静态编程语言编写线程安全单例的最佳实践是什么? 我想是的,但我在文件中找不到任何明确的声明。

  • 我有一个用Kotlin(android studio)编写的android应用程序和用React Native编写的应用程序的UI。我的问题是这些能联系在一起吗?如果是,怎么做?还有,你们能发布一些我可以通过的链接吗。 附注:我对react Native一无所知。