【问题标题】:XMPP aSmack - How can I listen on my own user state (Online/Offline) to ReconnectXMPP aSmack - 我如何监听我自己的用户状态(在线/离线)以重新连接
【发布时间】:2017-06-07 23:06:48
【问题描述】:

我是 android 中 xmpp/asmack 的新手,我正在寻找一种方法来监听我自己的用户状态和服务器上的状态变化。

如果丢失,我的目标是恢复连接。

我正在使用花名册的存在,这有助于我获得朋友的存在,但实际上不是当前用户本身。

任何帮助将不胜感激:)

最好的问候,

【问题讨论】:

  • 你到底想做什么?
  • 我想保持 XMPP 连接稳定,所以如果我的用户断开连接(离线)我必须自动重新连接.....

标签: java android xmpp asmack


【解决方案1】:

还有另一种使用计时器重新连接的方法:

public class TaxiConnectionListener implements ConnectionListener {
    private Timer tExit;
    private String username;
    private String password;
    private int logintime = 2000;
    @Override
    public void connectionClosed() {
        Log.i("TaxiConnectionListener", "disconnect");
        XmppConnection.getInstance().closeConnection();
        tExit = new Timer();
        tExit.schedule(new timetask(), logintime);
    }
    @Override
    public void connectionClosedOnError(Exception e) {
        Log.i("TaxiConnectionListener", "failed to disconnect");
        boolean error = e.getMessage().equals("stream:error (conflict)");
        if (!error) {
            XmppConnection.getInstance().closeConnection();
            tExit = new Timer();
            tExit.schedule(new timetask(), logintime);
        }
    }
    class timetask extends TimerTask {
        @Override
        public void run() {
            username = Utils.getInstance().getSharedPreferences("taxicall",
                    "account", MainActivity.context);
            password = Utils.getInstance().getSharedPreferences("taxicall",
                    "password", MainActivity.context);
            if (username != null && password != null) {
                Log.i("TaxiConnectionListener", "logining");
                if (XmppConnection.getInstance().login(username, password)) {
                    Log.i("TaxiConnectionListener", "logined");
                } else {
                    Log.i("TaxiConnectionListener", "reconnect");
                    tExit.schedule(new timetask(), logintime);
                }
            }
        }
    }
    @Override
    public void reconnectingIn(int arg0) {
    }
    @Override
    public void reconnectionFailed(Exception arg0) {
    }
    @Override
    public void reconnectionSuccessful() {
    }
}

您需要在您的登录方法中添加一个连接监听器:

TaxiConnectionListener connectionListener = new TaxiConnectionListener();
getConnection().addConnectionListener(connectionListener);

在断开连接方法中移除监听器:

 connection.removeConnectionListener(connectionListener);

【讨论】:

    【解决方案2】:

    要实现自动重连,需要利用ReconnectionManager,实现接口ConnectionListener来获取通知。

    详情可参考https://ramzandroidarchive.wordpress.com/2016/03/14/handling-connection-break-issue-in-smack-4-1/

    【讨论】:

      【解决方案3】:

      您必须启用 ReconectionManager。

      例子:

          XmppManager.config = XMPPTCPConnectionConfiguration.builder()
                  .setServiceName(serverName)
                  .setHost(server)
                  .setPort(port)
                  .build();
      
          connection = new XMPPTCPConnection(config);
      
      ConnectionListener connectionListener = new ConnectionListener(){...}; //
      connection.addConnectionListener( connectionListener );
      
      int RECONNECTION_ATTEMPT_SECONDS  = 60;
      
      ReconnectionManager.getInstanceFor(connection).enableAutomaticReconnection();
      ReconnectionManager.getInstanceFor(connection).setFixedDelay( RECONNECTION_ATTEMPT_SECONDS );
      

      ReconnectionListener 看起来像这样:

         public class ReconnectionListener implements ConnectionListener
          {   
      
              @Override
              public void reconnectionSuccessful()
              {
                  System.out.println( "Connection to chat server restored - You are again online" );
      
          //additional foo when connection restored
              }
      
              @Override
              public void reconnectionFailed( Exception e )
              {
                  System.out.println("Impossible to reconnect, Chat Server seems to be still unavailable" );
      
              }
      
              @Override
              public void reconnectingIn( int seconds )
              {
                  System.out.println( "reconnectingIn fired "+seconds);
              }
      
              @Override
              public void connectionClosedOnError( Exception e )
              {
                  System.out.println("Connection closed, Chat Server become unavailable" );
          //additional  foo when connection lost (message to user ?)
              }
      
              @Override
              public void connectionClosed()
              {
                  // "XMPP connection was closed.");
                  System.out.println( "Connection closed, Chat Server become unavailable");
              }
      
              @Override
              public void connected( XMPPConnection connection )
              {
                  System.out.println("connected fired - reconnection management enabled");
              }
      
              @Override
              public void authenticated( XMPPConnection connection, boolean resumed )
              {
                  System.out.println("authenticated fired");      
              }
      
          }
      

      如果有帮助,请不要忘记接受答案 :)

      【讨论】:

        猜你喜欢
        • 2013-01-05
        • 2015-04-03
        • 2011-06-25
        • 2021-07-06
        • 1970-01-01
        • 2012-02-06
        • 2016-03-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多