Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android studio 从片段调用类的方法时出现问题_Android Studio_Kotlin_Android Fragmentactivity - Fatal编程技术网

Android studio 从片段调用类的方法时出现问题

Android studio 从片段调用类的方法时出现问题,android-studio,kotlin,android-fragmentactivity,Android Studio,Kotlin,Android Fragmentactivity,我在这里有两门课: #1个报警接收器 class AlarmReceiver: BroadcastReceiver() { ... fun setRepeatingAlarm(context: Context) {} //the method that i want to call } #2设置片段(附在设置活动上) 但我得到错误“在FragmentActivity类型的可空接收器上只允许安全(?)或非空断言(!!)调用”” 如何解决这个问题?谢谢:)活动属性实际上正在调用片段的getActi

我在这里有两门课:

#1个报警接收器

class AlarmReceiver: BroadcastReceiver() {
...
fun setRepeatingAlarm(context: Context) {} //the method that i want to call
}
#2设置片段(附在设置活动上)

但我得到错误“在FragmentActivity类型的可空接收器上只允许安全(?)或非空断言(!!)调用”
如何解决这个问题?谢谢:)

活动
属性实际上正在调用
片段
getActivity()
方法,该方法可以返回null-片段可能处于创建状态,但实际上尚未附加到
活动
,因此,在这种情况下,该方法将返回
null

您正在将另一个调用链接到结果上,因此因为它可能为null,所以您要么调用
Activity.applicationContext
(好!),要么调用
null.applicationContext
(非常糟糕!)。因此,警告告诉您正在这样做,您要么需要安全地处理潜在的空值(使用
?。
调用),要么明确地说“当我调用它时,它肯定不会为空”(使用
调用)

你应该仔细阅读,因为它很重要,而且它最终会让你的生活变得更轻松。但是在这种情况下(以及大多数情况下),您不应该使用
因为在某些情况下它不是真的,所以属性将为null,然后你的应用程序崩溃

以下是安全的处理方法:

activity?.let { alarmReceiver.setRepeatingAlarm(it.applicationContext) }

有很多方法可以编写,但这是最简单的理解-如果
活动
不为null,它将运行
let
块,将非null
活动
作为一个名为
it
的变量传入。然后你可以用同样的方式运行你的代码,因为现在你知道它不是空的!如果
activity
为null,则该
let
块将根本不会运行。你的警报不会被设置,但如果你的应用程序崩溃也不会被设置-你可以用这种方式处理它,或者如果这是一种罕见的不应该发生的情况,你可以什么都不做-它肯定不会因为
NullPointerException
而崩溃

根据类型定义,
activity
可以是
null
。如果您确定此处不能为
null
,请编写
alarmReceiver.setRepeatingAlarm(activity!!.applicationContext)
alarmReceiver.setRepeatingAlarm(activity.applicationContext)
activity?.let { alarmReceiver.setRepeatingAlarm(it.applicationContext) }