用mqtt做及时通信,mqtt服务本身是放在本地的service服务里面运行,在应用关闭的时候,mqtt服务也要断开连接,不然会继续占用服务器的cpu,增加服务器负担。所以,在service的onDestroy中,需要调用MqttAndroidClient.disconnect()方法,但是会出现如下报错.
Fatal Exception: java.lang.RuntimeException: Unable to stop service com.ume.umebiz.service.push.MMqttService@ecb8e6: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.Object.hashCode()' on a null object reference
at android.app.ActivityThread.handleStopService(ActivityThread.java:3568)
at android.app.ActivityThread.-wrap26()
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1726)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:173)
at android.app.ActivityThread.main(ActivityThread.java:6651)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:822)
因为mqttAndroidClient本身就是一个广播。解注册广播需要调用unregisterResources方法。但是广播本身就是系统的底层通信,属于异步操作,然后接着调用disconnect就会导致广播还没有解注册就进行diconnect,所以需要在解注册的时候做一个50ms的线程阻塞等待,就可以避免该情况的出现.
override fun onDestroy() {
EventBus.getDefault().unregister(this)
if(mqttAndroidClient!=null){
Thread.sleep(50)
mqttAndroidClient?.disconnect()
}
LogUtils.d("MMqttService onDestroy")
super.onDestroy()
}