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

  • 相关阅读:
    将本地文件拷到HDFS中
    error C2243: “类型转换”: 从“TechCompany *”到“Company *”的转换存在,但无法访问
    eclipse统计整个项目的代码行数
    查找某个文件在HDFS集群中的位置
    2013年4月22日星期一JS操作 熟悉
    2013年4月18日星期四
    2013年4月19日星期五
    2013年4月25日星期四
    2013年4月20日星期六
    2013年4月22日星期一JS操作 熟悉
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/7002369.html
Copyright © 2020-2023  润新知