我应该通过继承Application来初始化onCreate中的单例吗?

时间:2018-01-17 10:20:42

标签: android android-activity singleton

我尝试使用a singleton like this。必须使用上下文调用init()。我在MainActivity的onCreate()中调用了它。但是有一个问题的情况。

我们说还有另一项活动Activity2。在MainAcvitiy,我开始了Activity2。然后,我按下主页按钮并使用其他应用程序。现在,我回到了我的应用程序,它崩溃了。我看了日志。似乎我的应用程序已重新启动,但MainAcivity已被跳过,它直接从Activity2开始。这不是我所期待的。由于单例类仅在MainActivity中初始化,如果应用程序从Activity2开始,则不会初始化。

我可以将初始化代码放到所有活动的onCreate()中,但这似乎是件坏事。我想我可以继承Application并在那里进行初始化。但那是对的地方吗?文档说通常不需要子类Application。

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.loser, PID: 32117
java.lang.RuntimeException: Unable to resume activity {com.loser/com.loser.Activity2}: java.lang.RuntimeException: Call init() first.
   at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3454)
   at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3494)
   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2757)
   at android.app.ActivityThread.-wrap12(ActivityThread.java)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1496)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:154)
   at android.app.ActivityThread.main(ActivityThread.java:6186)
   at java.lang.reflect.Method.invoke(Native Method)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)
Caused by: java.lang.RuntimeException: Call init() first.
   at com.loser.MySingleton$Companion.getInstance(MySingleton.kt:44)
   at com.loser.Activity2.onResume(Activity2.kt:93)
   at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1270)
   at android.app.Activity.performResume(Activity.java:6788)
   at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3431)
   at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3494) 
   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2757) 
   at android.app.ActivityThread.-wrap12(ActivityThread.java) 
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1496) 
   at android.os.Handler.dispatchMessage(Handler.java:102) 
   at android.os.Looper.loop(Looper.java:154) 
   at android.app.ActivityThread.main(ActivityThread.java:6186) 
   at java.lang.reflect.Method.invoke(Native Method) 
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889) 
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779) 

2 个答案:

答案 0 :(得分:0)

我会在onCreate方法的Application类中初始化它,然后在任何地方get()实例。

或者您可以将Context对象本身传递给get方法,以便在尚未初始化的情况下初始化该实例。

if(_instance == null) init();

答案 1 :(得分:0)

如果您只需要Context,则可以使用任何上下文或getApplicationContext()。初始化必须以这种方式工作。如果没有,我们需要更多信息(日志)。