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

近期使用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)来设置是否自己主动连接,默认又一次尝试连接以防突然断开,又一次连接管理将立马连接到server和在尝试连接失败时添加延迟。

你也能够自己调用Connection.connect()来手动连接。

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

解决的方法也非常easy,要么就是设置不自己主动连接,setReconnectionAllowed(false)。要么就不用自己实现重连操作。

posted @ 2017-06-13 17:16  zhchoutai  阅读(302)  评论(0编辑  收藏  举报