MQTTAndroidClient?.disconnect() 报错的解决方式

883 阅读1分钟

用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()
}