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

  • 相关阅读:
    C# NAudio 变声
    初探Protostuff的使用
    CentOS7 配置阿里云yum源,非常之简单
    javacv 视频增加视频(画中画)
    抓包调试fiddler
    CentOS7 手动编译升级GCC至9.3.0
    C# CefSharp 新版本(83 以后版本) 如何在js中直接调用c#类
    毕业设计——驾驶证理论考试系统的设计与实现 2022年1月2日20:35:14
    送餐机器人乐动雷达记录
    linux下拉取git代码
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/7002369.html
Copyright © 2011-2022 走看看