如果在Kotlin vs Java中声明,用作全局上下文的MainApplication类将崩溃
我在AndroidManifest.xml中声明了一个MainApplication类如果在Kotlin vs Java中声明,用作全局上下文的MainApplication类将崩溃,java,android,kotlin,sharedpreferences,Java,Android,Kotlin,Sharedpreferences,我在AndroidManifest.xml中声明了一个MainApplication类 <application android:name=".MainApplication" ...other stuffs > } 一切都很好,我可以这样使用它: val c = MainApplication.shared() return c.getSharedPreferences(prefsKey, Context.MODE_PRIVATE) 但是,如
<application
android:name=".MainApplication" ...other stuffs >
}
一切都很好,我可以这样使用它:
val c = MainApplication.shared()
return c.getSharedPreferences(prefsKey, Context.MODE_PRIVATE)
但是,如果我声明与Kotlin类相同的类并调用MainApplication.shared
,我会收到一个错误,说我正在调用null对象上的SharedReferences
class MainApplication: Application() {
companion object {
@JvmStatic
val shared: MainApplication = MainApplication()
}
Kotlin类声明和singleton(SharedInstances)是否存在问题,或者我在尝试这样声明此类时是否出错?您得到的错误是因为无法以这种方式实例化应用程序对象。 为了获取应用程序对象,您需要在AndroidManifest.xml中使用android:name属性声明它
<application
android:icon="@mipmap/ic_launcher"
.
.
.
android:name="your.package.MainApplication">
</application>
或者在活动中
val myApplication = application as MainApplication
编辑1
如果您想要一个单例,可以直接在Kotlin中创建它
object Foo{
val bar: String = "Something you want globally"
}
但千万不要将上下文相关对象放入静态变量。问题是您正在创建
应用程序的实例。应该是这样的:
val c = MainApplication.shared()
return c.getSharedPreferences(prefsKey, Context.MODE_PRIVATE)
class MainApplication:Application(){
重写fun onCreate(){
super.onCreate()
appContext=applicationContext
}
伴星{
lateinit var appContext:上下文
}
}
在清单中,我有@NicolasManzini两种方法都是一样的,我更喜欢完全限定名,但你也可以使用它。实际上,我想在任何片段或活动之外使用这个上下文,这就是为什么我首先创建这个类的原因。在你回答之后,我对问题进行了细化。如果你想将应用程序作为包含自身的单例使用,我不鼓励你这样做,因为它会由于内存不足而成为反模式。绝对不是反模式。看见没有内存泄漏,只要我的应用程序处于活动状态,该类就必须处于活动状态。这个类里面除了对自身的引用之外没有任何东西。你是通常的嫌疑犯。。。我现在要测试你的答案:)哈哈哈。。。终于有人明白了我不知道你的答案是否准确,因为在做Java时,我不必重写onCreate(),但我猜解决问题的部分一定是lateinit。我最后做的是类MainApplication:Application(){override fun onCreate(){super.onCreate()shared=this}伴随对象{lateinit var shared:MainApplication}}在Java中,您在构造函数中初始化变量,如soinstance=this;
但在kotlin中,您正在创建一个新对象,如soval shared:MainApplication=MainApplication()
。我刚刚将您的代码移动到了onCreate
,因为只有在创建了应用程序对象之后,应用程序的其他部分才会初始化。
object Foo{
val bar: String = "Something you want globally"
}