[Opt]补上未提交的
This commit is contained in:
@@ -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()
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user