码迷,mamicode.com
首页 > 系统相关 > 详细

使用Openfire和Asmack实现IM功能,经常出现“Thread already started”的错误

时间:2015-07-07 19:36:51      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:openfire   thread   android   asmack   im   

最近使用Openfire和Asmack实现Android端的IM功能,但是实际使用的过程中,经常出现“java.lang.IllegalThreadStateException:Thread already started”的错误。

比如:

java.lang.IllegalThreadStateException
Thread already started
java.lang.Thread.checkNotStarted(Thread.java:871)
java.lang.Thread.start(Thread.java:1025)
org.jivesoftware.smack.PacketWriter.startup(PacketWriter.java:123)
org.jivesoftware.smack.XMPPConnection.initConnection(XMPPConnection.java:684)
org.jivesoftware.smack.XMPPConnection.connectUsingConfiguration(XMPPConnection.java:645)
org.jivesoftware.smack.XMPPConnection.connect(XMPPConnection.java:1062)
org.jivesoftware.smack.ReconnectionManager$2.run(ReconnectionManager.java:148)

查找发现,ReconnectionManager进行重连时,PacketReader和PacketWriter执行startup()方法时报错。startup()方法主要是启动一个线程,用来解析Packet。

“Thread already started”,顾名思义就是线程重复启动。我找到了半天都没有找到原因所在,最后在ConnectionConfiguration找到了原因。

ConnectionConfiguration里面有个参数,reconnectionAllowed,这个参数其实就是是否自动连接。使用ConnectionConfiguration.setReconnectionAllowed(boolean)来设置是否自动连接,默认重新尝试连接以防突然断开,重新连接管理将立刻连接到服务器和在尝试连接失败时增加延迟。你也可以自己调用Connection.connect()来手动连接。

问题就是,我设置了mConnectionConfiguration.setReconnectionAllowed(true),而同时我又实现了判断是否掉线,掉线则Connection.connect()。这样就悲剧地重复操作了。

解决办法也很简单,要么就是设置不自动连接,setReconnectionAllowed(false),要么就不用自己实现重连操作。

版权声明:本文为博主原创文章,未经博主允许不得转载。

使用Openfire和Asmack实现IM功能,经常出现“Thread already started”的错误

标签:openfire   thread   android   asmack   im   

原文地址:http://blog.csdn.net/u014375869/article/details/46791219

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!