如何在Smack中启用XEP-0199?

Bra*_*bin 4 android xmpp ping smack asmack

我正在使用aSmack.我的应用程序侦听聊天室并对消息作出反应,但它从不发送消息.如果聊天室在一段时间内保持静默状态然后发送新消息,则应用程序不会收到更多消息.我研究过,我认为XEP-0199就是这里的解决方案.我看到@Flow(当前的Smack维护者)实现了它并且相关问题已经关闭.

我认为我需要使用,PingProvider但我真的不知道如何连接这个类Connection.

如何启用XEP-0199?我该怎么用PingProvider


连接代码:

smack = SmackAndroid.init(getActivity().getApplicationContext());
connection = new XMPPConnection(App.getServer());
connection.addConnectionListener(new ConnectionListener() {

    private final static String SMACK = "SMACK";

    @Override
    public void reconnectionSuccessful() {
        Log.i(SMACK , "reconnectionSuccessful");
    }

    @Override
    public void reconnectionFailed(Exception e) {
        Log.i(SMACK, "reconnectionFailed", e);
    }

    @Override
    public void reconnectingIn(int seconds) {
        Log.i(SMACK, "reconnectingIn " + seconds);
    }

    @Override
    public void connectionClosedOnError(Exception e) {
        Log.i(SMACK, "connectionClosedOnError", e);
    }

    @Override
    public void connectionClosed() {
        Log.i(SMACK, "connectionClosed");
    }
});
connection.connect();
connection.login(user, password);
Run Code Online (Sandbox Code Playgroud)

Bra*_*bin 6

我修复了手动实现ping响应的问题:

connection.addPacketListener(new PacketListener() {

    @Override
    public void processPacket(Packet packet) {
        connection.sendPacket(new Pong((Ping) packet));
    }
}, new PacketFilter() {

    @Override
    public boolean accept(Packet packet) {
        return packet instanceof Ping;
    }
});
Run Code Online (Sandbox Code Playgroud)


Dia*_*ada 5

防止用户断开会话连接

PingManager pm =  PingManager.getInstanceFor(MyApplication.connection) ;
    pm.setPingInterval(5) ;  // 5 sec
    pm.pingMyServer() ;
    pm.registerPingFailedListener(new PingFailedListener() {

        @Override
        public void pingFailed() {
            Log.e(TAG , "pingFailed") ;
        }
    });
Run Code Online (Sandbox Code Playgroud)