How to keep a XMPP connection stable on Android with (a)smack?

后端 未结 6 1891
梦毁少年i
梦毁少年i 2020-12-02 18:39

I use asmack-android-7-beem library for Android. I have a background service running, such as my app stays alive. But sooner or later XMPP connection dies without any notice

6条回答
  •  野趣味
    野趣味 (楼主)
    2020-12-02 19:24

    Here's my code work fine for ReconnectionManager

    1) Add addConnectionListener on xmpp connection

    XMPPConnectionListener mConnectionListener = new XMPPConnectionListener(username);
    connection.addConnectionListener(mConnectionListener);
    

    2) if connection closed then reconnect automatically using ReconnectionManager class

     ReconnectionManager reconnectionManager = ReconnectionManager.getInstanceFor(connection);
     reconnectionManager.enableAutomaticReconnection();
     reconnectionManager.setEnabledPerDefault(true);
    

    3) ConnectionListener for reconnect, connect and authenticated on server. if connection authenticated successfully with server also register PingManager and ServerPingWithAlarmManager class.

    public class XMPPConnectionListener implements ConnectionListener {
        String username="";
        public XMPPConnectionListener(String username){
            this.username=username;
        }
        @Override
        public void connected(final XMPPConnection connectionObeject) {
    
            sendPresenceAvailable();
            Log.d(TAG, "xmpp Connected()");
            connected = true;
    
        }
    
        @Override
        public void connectionClosed() {
    
            Log.d(TAG, "xmpp ConnectionCLosed()");
    
            isAuthenticatedPreviouly=false;
            connected = false;
    
            loggedin = false;
    
        }
    
        @Override
        public void connectionClosedOnError(Exception arg0) {
            Log.d(TAG, "xmpp ConnectionClosedOnError() :"+System.currentTimeMillis());
    
            isAuthenticatedPreviouly=false;
            connected = false;
    
            loggedin = false;
        }
    
        @Override
        public void reconnectingIn(int arg0) {
            Log.d(TAG, "xmpp reconnectingIn() :"+System.currentTimeMillis());
    
            loggedin = false;
        }
    
        @Override
        public void reconnectionFailed(Exception arg0) {
            Log.d(TAG, "xmpp ReconnectionFailed!");
            connected = false;
    
           // chat_created = false;
            loggedin = false;
            try {
                connection.connect();
            } catch (SmackException | IOException | XMPPException | InterruptedException exception) {
                exception.printStackTrace();
            }
        }
    
        @Override
        public void reconnectionSuccessful() {
            Log.d(TAG, "xmpp ReconnectionSuccessful");
            connected = true;
            sendPresenceAvailable();
            loggedin = false;
        }
    
        @Override
        public void authenticated(XMPPConnection connection2, boolean resumed) {
    
            Log.d(TAG, "xmpp Type Main Authenticated() :" + connection.isAuthenticated());
    
            if(connection.isAuthenticated()) {
    
                ServerPingWithAlarmManager.getInstanceFor(connection).setEnabled(true);
    
                PingManager pingManager = PingManager.getInstanceFor(connection);
                pingManager.setPingInterval(10);
    
                try {
                    pingManager.pingMyServer();
                    pingManager.pingMyServer(true,10);
                    pingManager.pingServerIfNecessary();
                    pingManager.registerPingFailedListener(new PingFailedListener() {
                        @Override
                        public void pingFailed() {
                            Log.d("Ping","pingFailed");
                            disconnect();
                            connect();
                        }
                    });
    
                registerAllListener();
         }
    }
    

提交回复
热议问题