前言
上一篇提到了MQTT的通用方式,由于智能家居TV的项目网络波动频繁,通用的方式已经无法满足需求,经常会出现重复订阅导致收到多条消息,那就只能另辟蹊径了,最终找到了梦寐以求的MqttAndroidClient。
1.集成
集成方式和上一篇的MQTT简介和使用要新增配置,build.gradle新增
implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
manifest文件里面需要注册服务
2.MqttAndroidClient重要源码解析
MqttAndroidClient是专门对MQTTClient的再封装拓展类,包含了订阅、连接以及多线程的处理,直接看MqttAndroidClient对于连接的封装源码,非关键代码已省略
public IMqttToken connect(MqttConnectOptions options, Object userContext,
IMqttActionListener callback) throws MqttException {
if (mqttService == null) {
}
else {
pool.execute(new Runnable() {
@Override
public void run() {
doConnect();
}
});
}
return token;
}
doConnect()连接操作放在子线程,有效避免网络波动连接时间过长阻塞主线程
private void doConnect() {
...
mqttService.connect(clientHandle, connectOptions, null,
activityToken);
...
}
阿里专门针对安卓客户端写了一个MQTTService,方便统一管理,除了连接操作,重连,断开连接都是在MQTTService中完成。
public void connect(String clientHandle, MqttConnectOptions connectOptions,
String invocationContext, String activityToken)throws MqttSecurityException, MqttException {
MqttConnection client = getConnection(clientHandle);
client.connect(connectOptions, null, activityToken);
}
public void connect(MqttConnectOptions options, String invocationContext,
String activityToken) {
...
if (myClient != null) {
if (isConnecting ) {
}else if(!disconnected){
}
else {
service.traceDebug(TAG, "myClient != null and the client is not connected");
service.traceDebug(TAG,"Do Real connect!");
setConnectingState(true);