main应用程序类将崩溃

n8ghc7c1  于 2021-07-08  发布在  Java
关注(0)|答案(2)|浏览(658)

我在androidmanifest.xml中声明了一个mainapplication类

<application
    android:name=".MainApplication" ...other stuffs >

我将其用作我的应用程序的全局上下文,可在任何活动或片段之外访问。
如果我将我的主应用程序类声明为:

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类相同的类并调用 MainApplication.shared 我收到一个错误,说我正在调用空对象上的SharedReferences

class MainApplication: Application() {
companion object {
    @JvmStatic
    val shared: MainApplication = MainApplication()
}

kotlin类声明和singleton(sharedinstances)有问题吗?或者我在这样声明这个类时犯了错误吗?

2ledvvac

2ledvvac1#

问题是您正在创建 Application 班级。应该是这样的:

class MainApplication : Application() {

    override fun onCreate() {
        super.onCreate()

        appContext = applicationContext
    }

    companion object {
        lateinit var appContext: Context
    }
}
u7up0aaq

u7up0aaq2#

您得到的错误是因为您不能以这种方式示例化应用程序对象。为了获得应用程序对象,需要在androidmanifest.xml中用android:name property

<application
    android:icon="@mipmap/ic_launcher"
    .
    .
    .
    android:name="your.package.MainApplication">

</application>

为了让应用程序在一个片段中,你可以这样做

val myApplication = requireActivity().application as MainApplication

或者在活动中

val myApplication = application as MainApplication

编辑1如果你想有一个单例,你可以直接在kotlin中创建它

object Foo{
   val bar: String = "Something you want globally"
}

但千万不要把上下文相关的对象放在静态变量中。

相关问题