使用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)。要么就不用自己实现重连操作。