最近在Android下使用mqtt的客服端传输数据,mqtt服务本身是放在本地的service服务里面运行,在应用关闭的时候,mqtt服务也要断开连接,不然会继续占用手机的资源。关于mqtt服务器如何实现的,包括连接服务器,断线重连,订阅消息,处理消息,发布消息等,网上的信息很多我就不再重复。我把使用过程中遇到的一些问题说一下。
首先是在断开连接时总是报错,用户虽然感觉不到错误但作为一名好的程序员必须改正这个bug,那么在service的onDestroy中,如何断开连接呢?一些网友直接调用client.disconnect(),出现了如此报错:
有的文章说要先调用client.unregisterResources(),再运行Thread.sleep(50),隔一点时间后调用client.disconnect(),可是我这样做了报错从上面的两个改为一个,AlarmPingSender$AlarmReceiver广播还是没能注销,如何断开MQTT连接呢?查看源码发现没那么复杂,直接关掉,释放这个资源就行了。在onDestroy()里调用下面的方法就不会有报错,MQTT客服端的具体实现可查看下载源码。
public static void disconnect() {
try {
if (client != null) {
if(client.isConnected())
client.unsubscribe(Constants.MYTOPIC);
client.close();
client.unregisterResources();
client = null;
}
} catch (Exception e) {
e.printStackTrace();
}
}