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

Posted

技术标签:

【中文标题】我应该使用 AsyncTask 建立 XMPP 连接吗?【英文标题】:Should I use AsyncTask to establish an XMPP connection? 【发布时间】:2015-08-31 08:26:15 【问题描述】:

我正在使用Smack 连接到android 中的XMPP server。这是我的代码:

 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 中这样做还是没有必要?我有点困惑。

【问题讨论】:

【参考方案1】:

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

【讨论】:

你能帮我吗?给我一个链接或其他东西,我可以找到有关连接状态服务的一些有用信息 查看 Android 的各种开源 XMPP 实现的代码。例如 MAXS Transport XMPP。 我查看了该项目,但无法确定哪个 og 类是服务。我找到了一个 java 类 XMPPService 但它没有扩展服务类。你能给我一个它的服务的链接吗? 有没有更简单的方法来做到这一点。就像只是向 xmpptcpconnection 添加一个连接监听器,它还考虑到网络活动,如在 3g 或 wifi 之间切换等? 你仍然需要一个地方来保存你的 XMPPConnection 参考。【参考方案2】:

当我调用 openConnection() 时,我应该在 asynctask 中这样做还是不需要这样做?

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

【讨论】:

嗨,我在一个线程的应用程序类中编写了 xmpp 连接。当我从最近的应用程序列表中杀死该应用程序时,xmpp 也工作了吗? 因为thread 仍在运行。您必须停止thread 可能才能实现您想要的。You should manage your XMPP(TCP)Connection within an Android Service-检查@Flow 答案 我希望 xmpp 在仅打开应用程序时工作。如果我使用绑定服务,我需要在所有活动中编写代码。请给我一个解决方案。 如果您包含在从Application 扩展的活动中,则不需要包含在所有其他活动中。或者你可以实现一个抽象类 好的。假设我在应用程序类中包含服务。那么什么时候终止服务呢?【参考方案3】:

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

AsyncTask 允许正确且轻松地使用 UI 线程。这节课 允许执行后台操作并在用户界面上发布结果 线程,而无需操作线程和/或处理程序。

【讨论】:

但我似乎有些人在没有 asynctask 的情况下使用它 当然不用AsnycTask也可以,但这不是正确的做法。该文档还指出:“AsyncTasks 应该理想地用于短操作(最多几秒钟。)”【参考方案4】:

四处搜索后,我选择不将 AsyncTask 用于我的 smack 项目。

    它的线程模型在Android版本之间有很大的不同,需要注意,蜂窝后也是单线程,长时间阻塞这会导致整个设备上也使用AsyncTask,xmpp和bosh会导致长时间阻塞高达秒/分钟 AsyncTask 对activity有隐式引用,这么长的操作会导致内存问题,或者异常处理不当容易导致内存泄漏 如果参考活动被重置,AsyncTask 的结果将丢失,但 Android 中的活动可以像简单的设备轮换或网络配置更改一样简单地重置,太多的保存和恢复实例无法使用,因为每个 xmpp 操作可能长期任务

【讨论】:

以上是关于我应该使用 AsyncTask 建立 XMPP 连接吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PHP 连接到 XMPP 服务器

在 Google Talk XMPP TCP 连接上使用 TLS 使用 PHP

无法使用 agsXMPP 连接到 GCM(无法建立连接,因为目标机器主动拒绝它)

如何从 Javascript 连接到 XMPP 服务器

如何将 xmpp 侦听器添加到 android 中的服务?

如何在android设备和xmpp服务器之间建立连接?