[Opt]补上未提交的

This commit is contained in:
chenfufeng
2023-03-03 15:54:26 +08:00
parent f0d12120ac
commit cd21845185
2 changed files with 85 additions and 0 deletions

View File

@@ -0,0 +1,49 @@
package com.mogo.telematic
import android.os.Handler
import android.os.HandlerThread
import android.os.Message
object TelematicHandler {
private const val MSG_DELAY = 100
private val handlerThread by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
HandlerThread("TelematicHandler")
}
private var handler: Handler? = null
private var listener: ITelematicListener? = null
@JvmStatic
fun init() {
handlerThread.start()
handler = object : Handler(handlerThread.looper) {
override fun handleMessage(msg: Message) {
super.handleMessage(msg)
if (msg.what == MSG_DELAY) {
listener?.delayCompleted()
}
}
}
}
@JvmStatic
fun setListener(listener: ITelematicListener) {
this.listener = listener
}
@JvmStatic
fun delay(delayMillis: Long) {
handler?.sendEmptyMessageDelayed(MSG_DELAY, delayMillis)
}
@JvmStatic
fun removeDelay() {
handler?.removeMessages(MSG_DELAY)
}
interface ITelematicListener {
fun delayCompleted()
}
}

View File

@@ -0,0 +1,36 @@
package com.mogo.telematic.client.handler
import com.mogo.telematic.client.listener.NettyClientListener
import com.mogo.telematic.client.status.ConnectState
import io.netty.buffer.Unpooled
import io.netty.channel.ChannelFuture
import io.netty.channel.ChannelHandlerContext
import io.netty.channel.ChannelInboundHandlerAdapter
import io.netty.handler.timeout.IdleStateEvent
import io.netty.util.CharsetUtil
class HeartbeatHandler(val listener: NettyClientListener<*>): ChannelInboundHandlerAdapter() {
private val heartbeatData by lazy {
Unpooled.unreleasableBuffer(Unpooled.copiedBuffer("HEARTBEAT", CharsetUtil.UTF_8))
}
override fun userEventTriggered(ctx: ChannelHandlerContext?, evt: Any?) {
if (evt is IdleStateEvent) {
ctx?.writeAndFlush(heartbeatData.duplicate())?.addListener { future ->
if (future is ChannelFuture) {
if (!future.isSuccess) {
listener.onClientStatusConnectChanged(
ConnectState.STATUS_CONNECT_CLOSED,
"channelInactive",
ctx.channel()
)
future.channel().close()
}
}
}
} else {
super.userEventTriggered(ctx, evt)
}
}
}