我应该使用 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 连接吗?的主要内容,如果未能解决你的问题,请参考以下文章
在 Google Talk XMPP TCP 连接上使用 TLS 使用 PHP