问题描述
我这里有2个课程:
#1 AlarmReceiver
class AlarmReceiver: broadcastReceiver() {
...
fun setRepeatingalarm(context: Context) {} //the method that i want to call
}
#2 SettingFragment(附加到SettingActivity)
SettingFragment(): PreferencefragmentCompat() {
private lateinit var reminder: String
private lateinit var language: String
private lateinit var alarmReceiver: AlarmReceiver
private lateinit var langPreference: Preference
private lateinit var reminderPreference: SwitchPreference
override fun onCreatePreferences(savedInstanceState: Bundle?,s: String?) {
addPreferencesFromresource(R.xml.settings)
init()
}
private fun init() {
reminder = resources.getString(R.string.key_reminder)
language = resources.getString(R.string.key_language)
alarmReceiver = AlarmReceiver()
langPreference = findPreference<Preference> (language) as Preference
reminderPreference = findPreference<SwitchPreference> (reminder) as SwitchPreference
}
private fun reminderSetting() {
// the method where i place the that method
}
我对如何从我调用的方法定义上下文参数感到困惑。 我试图对此进行编码:
alarmReceiver.setRepeatingalarm(activity.applicationContext)
但是我收到错误消息“ 在FragmentActivity类型的可为空的接收器上仅允许安全(?。)或非空断言(!!。)调用?” 如何解决这个问题呢?谢谢:)
解决方法
activity
属性实际上是在调用Fragment
的{{1}}方法,该方法可以返回null-片段可能处于创建状态,但不是。 t实际上实际上尚未附加到getActivity()
上,因此在这种情况下,此方法将返回Activity
。
您正在将另一个调用链接到结果,所以由于它可能为空,因此您正在调用null
(好!)或Activity.applicationContext
(很差!)。因此,警告提示您正在执行此操作,您要么需要安全地处理该潜在的null(使用null.applicationContext
调用),要么明确地说“当我调用它时,它肯定不会为null”(与?.
通话)
您应该阅读Kotlin's null safety handling,因为它很重要,并且可以使您的生活终极轻松。但是在这种情况下(大多数情况下),您不应该使用!!.
,因为在某些情况下,该字段将不为true,该属性将为null,然后您的应用程序崩溃
这是处理它的安全方法:
!!
您可以使用多种方法来编写代码,但这是最简单的理解-如果activity?.let { alarmReceiver.setRepeatingAlarm(it.applicationContext) }
不为null,它将运行activity
块,并传递非null {{1 }}作为变量let
。然后,您可以以相同的方式运行代码,因为现在您知道它不为空!如果activity
为为空,则该it
块将根本不会运行。您的闹钟不会设置,但如果您的应用程序崩溃了,也不会设置-您可以通过这种方式进行处理,或者在极少数情况下永远都不会发生,您什么也不能做-它是绝对不会因为activity
而崩溃!