Android socket.IO中的Emit或Ack超时处理?

时间:2018-07-05 14:14:28

标签: android socket.io

在处理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);
                }
            }
        });

有什么更好的方法可以在客户端断开连接时返回失败的回调?我需要手动实现超时?

1 个答案:

答案 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