【问题标题】:android: create global connection to open fire using Smack API 4.1.3android:使用 Smack API 4.1.3 创建全局连接以开火
【发布时间】:2015-09-01 08:54:01
【问题描述】:

目前,我正在编写以下代码以在所有活动(或说片段)中连接到 openfire 服务器:

XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder()
                .setServiceName(HOST)
                .setHost(HOST)
                .setPort(PORT)
                .setSecurityMode(ConnectionConfiguration.SecurityMode.disabled)
                .setDebuggerEnabled(true).build();
conn = new XMPPTCPConnection(config);
conn.connect();

然后,我正在完成我的任务,例如用户授权和身份验证(登录)、获取名册等。

有没有其他方法可以在某个地方创建全局连接,这样我就不必每次都创建连接。

我想要这样的实现,每次应用启动后,它应该只创建一次到 Openfire 服务器的连接,之后,我应该能够在任何 Activity(或片段)上使用相同的连接。

【问题讨论】:

    标签: android openfire smack


    【解决方案1】:

    使用以下单例类:

    public class XMPPConnectionManager {
    
        String serviceName = "SERVICENAME";
        String host = "HOST";
        int port = 5222;
        XMPPTCPConnectionConfiguration.Builder configBuilder;
        AbstractXMPPConnection connection;
        boolean setSecurityModeOn  = false;
        boolean shouldLogin = true;
    
        private static XMPPConnectionManager instance = null;
    
        private XMPPConnectionManager(){}
    
        public static XMPPConnectionManager getInstance() {
            if(instance == null) {
                instance = new XMPPConnectionManager();
            }
            return instance;
        }
    
        public void connect(String username, String password){
    
            XMPPTCPConnectionConfiguration.Builder configBuilder = XMPPTCPConnectionConfiguration.builder();
            configBuilder.setUsernameAndPassword(username, password);
            configBuilder.setServiceName(serviceName);
            configBuilder.setHost(host);
            configBuilder.setPort(port);
            if(!setSecurityModeOn) {
                configBuilder.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
            }
    
            connection = new XMPPTCPConnection(configBuilder.build());
            try {
                connection.connect();
                if(shouldLogin) {
                    connection.login();
                }
    
            } catch (SmackException e) {
    
                e.printStackTrace();
            } catch (IOException e) {
    
                e.printStackTrace();
            } catch (XMPPException e) {
    
                e.printStackTrace();
            }
        }
        public void logUserIn(){
            try {
                connection.login();
            } catch (XMPPException e) {
                e.printStackTrace();
            } catch (SmackException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        public void disconnect(){
            if(connection != null) {
                connection.disconnect();
            }
        }
        public AbstractXMPPConnection getConnection() {
            return connection;
        }
    
        public XMPPTCPConnectionConfiguration.Builder getConfigBuilder() {
            return configBuilder;
        }
    
        public void setConfigBuilder(XMPPTCPConnectionConfiguration.Builder configBuilder) {
            this.configBuilder = configBuilder;
        }
    
        public void setConnection(AbstractXMPPConnection connection) {
            this.connection = connection;
        }
    
        public void setHost(String host) {
            this.host = host;
        }
    
    
    
        public void setPort(int port) {
            this.port = port;
        }
    
        public void setSetSecurityModeOn(boolean setSecurityModeOn) {
            this.setSecurityModeOn = setSecurityModeOn;
        }
    
        public void setServiceName(String serviceName) {
            this.serviceName = serviceName;
        }
    
        public void setShouldLogin(boolean shouldLogin) {
            this.shouldLogin = shouldLogin;
        }
    }
    

    使用方法:

     XMPPConnectionManager.getInstance().connect("username","password");
    

    要在任何其他类/活动中获取连接,只需像这样再次获取管理器的单例类:

    AbstractXMPPConnection connection = XMPPConnectionManager.getInstance().getConnection();
    

    如果有任何问题,请告诉我。

    【讨论】:

      猜你喜欢
      • 2018-11-12
      • 2017-09-16
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 2015-10-24
      • 1970-01-01
      相关资源
      最近更新 更多