在处理socket.io
发出的带有回调的消息时,如果套接字在应答之前断开连接(或根本不应答),则回调函数将永远挂断。在其他情况下,网络连接性低并且发出套接字但是如果发射成功,则没有回调。
在这种情况下,我想在send回调中实现超时。但是ACK消息没有超时。
这里我的套接字使用ACK
发出代码
JSONObject obj = new JSONObject();
try {
obj.put("device_id", deviceVO.getDeviceId());
obj.put("device_status", deviceVO.getOldStatus());
} catch (JSONException e) {
e.printStackTrace();
}
mSocket.emit("socketChangeDevice", obj, new Ack() {
@Override
public void call(Object... args) {
if(args!=null){
Ack ack = (Ack) args[args.length - 1];
ack.call();
Log.d("ACK_SOCKET","isAck : "+ ack);
}
}
});
有什么更好的方法可以在客户端断开连接时返回失败的回调?我需要手动实现超时?
答案 0 :(得分:0)
带有套接字发射的超时ACK
我的'eq'
自定义超时类,带有工具AckWithTimeOut
接口
Ack
在套接字发射侦听器中添加public class AckWithTimeOut implements Ack {
private Timer timer;
private long timeOut = 0;
private boolean called = false;
public AckWithTimeOut() {
}
public AckWithTimeOut(long timeout_after) {
if (timeout_after <= 0)
return;
this.timeOut = timeout_after;
startTimer();
}
public void startTimer() {
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
callback("No Ack");
}
}, timeOut);
}
public void resetTimer() {
if (timer != null) {
timer.cancel();
startTimer();
}
}
public void cancelTimer() {
if (timer != null)
timer.cancel();
}
void callback(Object... args) {
if (called) return;
called = true;
cancelTimer();
call(args);
}
@Override
public void call(Object... args) {
}
}
AckWithTimeOut