zoukankan      html  css  js  c++  java
  • 使用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)。要么就不用自己实现重连操作。

  • 相关阅读:
    2019/1/2
    2018/12/22
    2018/12/18
    2018/12/17
    2018/12/16
    编程总结汇总
    学习总结汇总
    第十三周学习总结--助教
    第十一周编程总结
    第10周编程总结
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/7002369.html
Copyright © 2011-2022 走看看