【问题标题】:Should I use AsyncTask to establish an XMPP connection?我应该使用 AsyncTask 建立 XMPP 连接吗?
【发布时间】: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 中这样做还是没有必要?我有点困惑。

【问题讨论】:

    标签: android android-asynctask server xmpp smack


    【解决方案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 项目。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-18
      • 1970-01-01
      • 2011-08-21
      • 1970-01-01
      • 1970-01-01
      • 2017-06-12
      • 1970-01-01
      相关资源
      最近更新 更多