我有一个带有辅助构造函数和变量的服务(接口MyCallback)。从活动开始服务并传递变量时,服务中的callback.operate()中有一个空指针异常。为什么?登录构造函数已通过,因此我具有非null的回调变量。但是在onStartCommand中它为null ... 在活动中,我实现MyCallback接口并启动服务:
startService(Intent(this, MyService(this)::class.java))
class MyService() : Service() {
private var callback : MyCallback? = null
constructor(callback : MyCallback) : this() {
this.callback = callback
if (this.callback!=null){
Log.v("log", "callback not null")
}
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int):Int
{
callback.operate()
}
}
答案 0 :(得分:1)
我有一个带有辅助构造函数和变量的服务。
删除辅助构造函数。
我在服务中的callback.operate()上有一个空指针异常
startService()
将不使用该辅助构造函数。 you 可能使用了辅助构造函数,但这不是有效的Service
实例,Android不会使用它。
如果您希望服务与应用程序的其他部分进行通信,则可以:
使用事件总线(LocalBroadcastManager
,greenrobot的EventBus等)
让您的服务与某个存储库单例对话,然后单例将信息提供给感兴趣的各方(通过回调,RxJava,LiveData
,Kotlin通道/流等)
让活动通过Messenger
附加项Intent
传递给服务,其中Messenger
绑定到该活动可以使用的某些Handler
接收服务发送的消息
答案 1 :(得分:0)
传递了构造函数的登录信息,所以我有非null的回调变量。
MyService(this)::class.java
是bound class reference;它将调用MyService(this)
,获取结果的类(即MyService
),然后将创建的实例丢弃。
然后startService
将使用主构造函数创建一个新实例。如果您将日志记录更改为
if (this.callback!=null) {
Log.v("log", "callback not null")
} else {
Log.v("log", "callback null")
}
您应该首先看到callback not null
,然后看到callback null
。