Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/207.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果在Kotlin vs Java中声明,用作全局上下文的MainApplication类将崩溃_Java_Android_Kotlin_Sharedpreferences - Fatal编程技术网

如果在Kotlin vs Java中声明,用作全局上下文的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) 但是,如

我在AndroidManifest.xml中声明了一个MainApplication

    <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中,您在构造函数中初始化变量,如so
instance=this;
但在kotlin中,您正在创建一个新对象,如so
val shared:MainApplication=MainApplication()
。我刚刚将您的代码移动到了
onCreate
,因为只有在创建了应用程序对象之后,应用程序的其他部分才会初始化。
object Foo{
   val bar: String = "Something you want globally"
}