您的源代码有几个问题:
-
请勿致电
client.connect()
中的方法
onCreate
(相反,只需保留
MqttAndroidClient
在此处创建)。打电话的好地方是
onResume
方法
-
您还有一个问题:您正在设置
token.setActionCallback()
之后
你打电话
客户connect()
-因此,如果计时不走运,将不会调用您的回调。
以下是您应该尝试的内容-首先定义几个回调:
private MqttConnectOptions mOptions;
private MqttAndroidClient mClient;
private IMqttActionListener mConnectCallback = new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken token) {
Log.d("mConnectCallback onSuccess");
subscribe();
}
@Override
public void onFailure(IMqttToken token, Throwable ex) {
Log.d("mConnectCallback onFailure " + ex);
}
};
private IMqttActionListener mSubscribeCallback = new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken token) {
Log.d("mSubscribeCallback onSuccess");
}
@Override
public void onFailure(IMqttToken token, Throwable ex) {
Log.d("mSubscribeCallback onFailure " + ex);
}
};
private IMqttActionListener mPublishCallback = new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken token) {
Log.d("mPublishCallback onSuccess");
}
@Override
public void onFailure(IMqttToken token, Throwable ex) {
Log.d("mPublishCallback onFailure " + ex);
disconnect();
connect();
}
};
private IMqttMessageListener mMessageListener = new IMqttMessageListener() {
@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
Log.d("mMessageListener onSuccess topic=" + topic + ", message=" + message);
}
};
然后定义方法:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mOptions = new MqttConnectOptions();
mOptions.setCleanSession(true);
mOptions.setUserName(username);
mOptions.setPassword(password.toCharArray());
mClient = new MqttAndroidClient(this, MQTT_HOST, clientId);
}
@Override
public void onResume() {
super.onResume();
connect();
}
@Override
public void onPause() {
super.onPause();
disconnect();
}
private void connect() {
try {
mClient.connect(mOptions, null, mConnectCallback);
} catch (Exception ex) {
ex.printStackTrace();
}
}
private void disconnect() {
try {
mClient.disconnect();
} catch (Exception ex) {
ex.printStackTrace();
}
mClient.unregisterResources();
}
private void subscribe() {
try {
IMqttToken subToken = mClient.subscribe(TOPIC, 1, null, mSubscribeCallback, mMessageListener);
} catch (Exception ex) {
ex.printStackTrace();
}
}
private void publish() {
try {
mClient.publish(topic, new MqttMessage(STR.getBytes()), null, mPublishCallback);
} catch (Exception ex) {
ex.printStackTrace();
}
}
您可以使用
custom interfaces
. 或通过使用
LocalBroadcastManager