我应该使用AsyncTask建立XMPP连接吗?

时间:2015-08-31 08:26:15

标签: android android-asynctask server xmpp smack

我使用XMPP serverAndroid中的Smack相关联。这是我的代码:

 static void openConnection() {
        try {
            if (null == connection || !connection.isAuthenticated()) {
                XMPPTCPConnectionConfiguration.Builder configuration = XMPPTCPConnectionConfiguration.builder();
                configuration.setHost(SERVER_HOST);
                configuration.setPort(SERVER_PORT);
                configuration.setServiceName(SERVICE_NAME);
                configuration.setUsernameAndPassword(new TinyDB(context.getApplicationContext()).getString("username"), new TinyDB(context.getApplicationContext()).getString("password"));
                configuration.setDebuggerEnabled(true);

                connection = new XMPPTCPConnection(configuration.build());
                connection.setUseStreamManagement(true);
                connection.setUseStreamManagementResumption(true);

                ReconnectionManager reconnectionManager = ReconnectionManager.getInstanceFor(connection);
                reconnectionManager.enableAutomaticReconnection();
                reconnectionManager.setReconnectionPolicy(ReconnectionManager.ReconnectionPolicy.RANDOM_INCREASING_DELAY);

                connection.connect();
                connection.login();
            }
        } catch (XMPPException xe) {
            xe.printStackTrace();
        } catch (SmackException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

所以当我拨打openConnection()时,我应该在AsyncTask中执行此操作,还是没有必要?我有点困惑。

4 个答案:

答案 0 :(得分:1)

您应该在Android XMPP(TCP)Connection内管理Service。服务状态(运行/停止)应重新组合连接状态:当服务运行时,应建立连接或服务应尝试建立连接(如果数据连接可用)。如果服务停止,则还断开连接。

答案 1 :(得分:0)

是的,正如官方文件所指出的那样:

  

AsyncTask可以正确,轻松地使用UI线程。这个班   允许执行后台操作并在UI上发布结果   线程,而不必操纵线程和/或处理程序。

答案 2 :(得分:0)

  

当我调用openConnection()时,我应该在asynctask中执行此操作还是不需要?

很快,。与networking相关的所有内容都应移至another thread,以避免阻止main thread。因此,doInBackground()的{​​{1}}会在另一个AsyncTask上运行,您应该将其称为thread

答案 3 :(得分:0)

我在搜索后选择不使用AsyncTask作为我的smack项目。

  1. 它的线程模型在Android版本之间已经有了很大的不同需要注意,而且在蜂窝之后,它是单线程,长阻塞这会导致整个设备上也出现问题,也会使用AsyncTask,xmpp和bosh会导致长时间阻塞最多秒/分钟
  2. AsyncTask具有对活动的隐式引用,这样的长操作会导致内存问题,或者在异常处理不正确时容易导致内存泄漏
  3. 如果引用活动重置,AsyncTask的结果将会丢失,但Android中的活动可以像简单的设备轮换或网络配置更改一样轻松重置,太多的保存和恢复实例使其可用于每个xmpp操作可能是长任务