我不太确定是否因延迟初始化属性而无法解决我的问题。但让我问一下:)
我有一个用于几乎所有活动的applicationController-因此我创建了一个BaseActivity
现在的问题是,当我想从child activity中的应用程序控制器获取依赖项时,我得到了Uninitialized Exception。
感谢您的帮助!
答案 0 :(得分:4)
因为您覆盖了BaseActivity
中的错误方法,所以您的应用程序崩溃了。
解决方案::将代码更改为
abstract class BaseActivity : AppCompatActivity() {
lateinit var applicationController: ApplicationController
// [IMPORTANT] Remove or comment-out this method
// override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
// super.onCreate(savedInstanceState, persistentState)
// applicationController = ApplicationController.getInstance(applicationContext)
// }
// Override this method
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
applicationController = ApplicationController.getInstance(applicationContext)
}
}
说明::本部分将说明代码为何无法正常工作。
kotlin.UninitializedPropertyAccessException
这是RuntimeException的子类,应用程序将抛出该异常 通过调用属性或方法访问对象时发生异常 在初始化之前自行解决。
创建LoginScreen
活动后,Android会调用其onCreate
方法。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_login_screen)
emailMatcher = applicationController.getEmailMatcher()
passwordMatcher = applicationController.getPasswordMatcher()
}
第一行super.onCreate(savedInstanceState)
将调用其父级的onCreate
方法,在这种情况下,将调用onCreate (bundle)
活动中的BaseActivity
。
不幸的是,在BaseActivity
活动中,您重写了applicationController
的初始代码并将其放在另一个与onCreate(bundle, persistentState)
类似的方法onCreate (bundle)
中。它们之间的区别在于参数数量。结果,此时applicationController
仍未初始化。
override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
super.onCreate(savedInstanceState, persistentState)
applicationController = ApplicationController.getInstance(applicationContext)
}
在应用程序到达此行之前
emailMatcher = applicationController.getEmailMatcher()
由于您在未初始化的对象getEmailMatcher
上调用applicationController
方法,因此应用抛出kotlin.UninitializedPropertyAccessException
并使应用崩溃。