如果在 Kotlin 与 Java 中声明,用作全局上下文的 MainApplication class 会崩溃
MainApplication class used as a global context crashes if declared in Kotlin vs Java
我在 AndroidManifest.xml
中声明了一个 MainApplication class
<application
android:name=".MainApplication" ...other stuffs >
我用作我的应用程序的全局上下文,可在任何 Activity 或 Fragment 之外访问。
如果我将我的 MainApplication class 声明为:
public class MainApplication extends Application {
private static MainApplication instance;
public MainApplication() {
instance = this;
}
public static MainApplication shared() {
return instance;
}
}
一切正常,然后我就可以像这样使用它了:
val c = MainApplication.shared()
return c.getSharedPreferences(prefsKey, Context.MODE_PRIVATE)
但是,如果我声明与 Kotlin class 相同的 class 并调用 MainApplication.shared
,我会收到一条错误消息,提示我正在对空对象
调用 sharedPreferences
class MainApplication: Application() {
companion object {
@JvmStatic
val shared: MainApplication = MainApplication()
}
Kotlin class 声明和单例 (SharedInstances) 是否存在问题,或者我尝试像这样声明此 class 是否出错?
您遇到错误是因为您无法以这种方式实例化应用程序对象。
为了获得应用程序对象,您需要在 AndroidManifest.xml 中使用 android:name 属性
声明它
<application
android:icon="@mipmap/ic_launcher"
.
.
.
android:name="your.package.MainApplication">
</application>
为了将应用程序放入 Fragment 中,您可以这样做
val myApplication = requireActivity().application as MainApplication
或 Activity
val myApplication = application as MainApplication
编辑 1
如果想有单例,可以直接在Kotlin中创建
object Foo{
val bar: String = "Something you want globally"
}
但永远不要将上下文相关的对象放在静态变量中。
问题是您正在创建 Application
class 的实例。它应该是这样的:
class MainApplication : Application() {
override fun onCreate() {
super.onCreate()
appContext = applicationContext
}
companion object {
lateinit var appContext: Context
}
}
我在 AndroidManifest.xml
中声明了一个 MainApplication class <application
android:name=".MainApplication" ...other stuffs >
我用作我的应用程序的全局上下文,可在任何 Activity 或 Fragment 之外访问。
如果我将我的 MainApplication class 声明为:
public class MainApplication extends Application {
private static MainApplication instance;
public MainApplication() {
instance = this;
}
public static MainApplication shared() {
return instance;
}
}
一切正常,然后我就可以像这样使用它了:
val c = MainApplication.shared()
return c.getSharedPreferences(prefsKey, Context.MODE_PRIVATE)
但是,如果我声明与 Kotlin class 相同的 class 并调用 MainApplication.shared
,我会收到一条错误消息,提示我正在对空对象
class MainApplication: Application() {
companion object {
@JvmStatic
val shared: MainApplication = MainApplication()
}
Kotlin class 声明和单例 (SharedInstances) 是否存在问题,或者我尝试像这样声明此 class 是否出错?
您遇到错误是因为您无法以这种方式实例化应用程序对象。 为了获得应用程序对象,您需要在 AndroidManifest.xml 中使用 android:name 属性
声明它<application
android:icon="@mipmap/ic_launcher"
.
.
.
android:name="your.package.MainApplication">
</application>
为了将应用程序放入 Fragment 中,您可以这样做
val myApplication = requireActivity().application as MainApplication
或 Activity
val myApplication = application as MainApplication
编辑 1 如果想有单例,可以直接在Kotlin中创建
object Foo{
val bar: String = "Something you want globally"
}
但永远不要将上下文相关的对象放在静态变量中。
问题是您正在创建 Application
class 的实例。它应该是这样的:
class MainApplication : Application() {
override fun onCreate() {
super.onCreate()
appContext = applicationContext
}
companion object {
lateinit var appContext: Context
}
}