【发布时间】:2016-09-06 11:55:13
【问题描述】:
我正在使用 MqttAndroidClient 开发一个包含聊天功能的应用程序,但我在初始化客户端时遇到了问题。
我想要实现的是运行一个单独的进程(使用 :remote)来运行 mqtt 客户端以订阅代理,以便从我的聊天服务器获取消息。 远程服务是在主活动中创建的,我使用 AIDL 设置了 IPC。 我知道错误代码指出IPC有错误;但是,我似乎找不到原因,因为我很确定我已经正确设置了 AIDL。
长话短说,这是我的服务代码:
private static final String MQTT_BROKER = "________(blank on purpose)";
private String userId;
private String publishTopic;
private String subscribeTopic;
MqttAndroidClient client;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return new Chat_AIDL.Stub() {
@Override
public String passString(String message) throws RemoteException {
return message;
}
};
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
userId = intent.getStringExtra("userId");
publishTopic = "chat/+/" + userId + "/";
subscribeTopic = "chat/#/" + userId + "/";
Log.d("publishTopic", publishTopic);
Log.d("subscribeTopic", subscribeTopic);
establishMqttConnection();
client.setCallback(new MqttCallback() {
@Override
public void connectionLost(Throwable cause) {
}
@Override
public void messageArrived(String topic, MqttMessage receivedMessage) throws Exception {
Intent in = new Intent();
String msg = new String(receivedMessage.getPayload(), "UTF-8");
in.putExtra("resultCode", Activity.RESULT_OK);
in.putExtra("chatMsg", msg);
Log.d("MQTT_RECEIVED", msg);
LocalBroadcastManager.getInstance(getBaseContext()).sendBroadcast(in);
}
@Override
public void deliveryComplete(IMqttDeliveryToken token) {
}
});
Log.d("SERVICE_CHAT", "STICKY");
super.onStartCommand(intent, flags, startId);
return Service.START_STICKY;
}
private void establishMqttConnection() {
MemoryPersistence memPer = new MemoryPersistence();
client = new MqttAndroidClient(this, MQTT_BROKER, userId, memPer);
try {
client.connect(null, new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken asyncActionToken) {
Log.d("MQTT", "SUCCESS");
subscribeMessage();
}
@Override
public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
Log.d("MQTT", "FAILURE");
exception.printStackTrace();
}
});
} catch (MqttException e) {
e.printStackTrace();
}
}
private void subscribeMessage() {
try {
client.subscribe(subscribeTopic, 0, null, new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken asyncActionToken) {
}
@Override
public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
}
});
} catch (MqttSecurityException e) {
e.printStackTrace();
} catch (MqttException e) {
e.printStackTrace();
}
}
【问题讨论】:
标签: java android service casting mqtt