diff --git a/modules/mogo-module-obu/src/main/java/com/zhidao/mogo/module/obu/socket/UdpSocketManager.kt b/modules/mogo-module-obu/src/main/java/com/zhidao/mogo/module/obu/socket/UdpSocketManager.kt index 0bbb52b427..c9b2ff594b 100644 --- a/modules/mogo-module-obu/src/main/java/com/zhidao/mogo/module/obu/socket/UdpSocketManager.kt +++ b/modules/mogo-module-obu/src/main/java/com/zhidao/mogo/module/obu/socket/UdpSocketManager.kt @@ -1,5 +1,7 @@ package com.zhidao.mogo.module.obu.socket +import android.os.Handler +import android.os.HandlerThread import android.util.ArrayMap import com.mogo.utils.logger.Logger import java.net.DatagramPacket @@ -11,15 +13,25 @@ import java.util.concurrent.Executors * udp socket 管理类,统一管理udp socket数据接收和发送 */ class UdpSocketManager(private val callback: IUdpSocketCallback? = null) { - companion object{ + companion object { const val TAG = "Mogo-UdpSocketManager" } + private val socketMap = ArrayMap() private val socketExecutor = Executors.newCachedThreadPool() - @Volatile private var isConnected = false + private val dataCacheThread = HandlerThread("obu-data-cache") + private val dataCacheHandler: Handler - fun sendMsgTo(msg:String,ip: String, port: Int) { + init { + dataCacheThread.start() + dataCacheHandler = Handler(dataCacheThread.looper) + } + + @Volatile + private var isConnected = false + + fun sendMsgTo(msg: String, ip: String, port: Int) { isConnected = true val address = SimpleAddress(ip, port) socketExecutor.execute(UdpSenderRunnable(address, msg)) @@ -31,14 +43,14 @@ class UdpSocketManager(private val callback: IUdpSocketCallback? = null) { socketExecutor.execute(UdpReceiverRunnable(address)) } - fun release(){ + fun release() { isConnected = false socketMap.forEach { it.value.close() } } - inner class UdpSenderRunnable(private val address: SimpleAddress,private val msg:String):Runnable{ + inner class UdpSenderRunnable(private val address: SimpleAddress, private val msg: String) : Runnable { override fun run() { Logger.d(TAG, "${address}准备发送消息: $msg") var socket = socketMap[address] @@ -50,7 +62,8 @@ class UdpSocketManager(private val callback: IUdpSocketCallback? = null) { socket.send(DatagramPacket(msg.toByteArray(), msg.toByteArray().size, netAddress, address.port)) } } - inner class UdpReceiverRunnable(private val address:SimpleAddress):Runnable{ + + inner class UdpReceiverRunnable(private val address: SimpleAddress) : Runnable { override fun run() { var socket = socketMap[address] Logger.d(TAG, "init receiver: $address") @@ -61,15 +74,18 @@ class UdpSocketManager(private val callback: IUdpSocketCallback? = null) { } val buffer = ByteArray(2048) val packet = DatagramPacket(buffer, buffer.size) - while (isConnected){ - if(socket.isClosed){ + while (isConnected) { + if (socket.isClosed) { break } - Logger.d(TAG,"准备接受消息====$address") + Logger.d(TAG, "准备接受消息====$address") socket.receive(packet) val msg = ByteArray(buffer.size) System.arraycopy(buffer, 0, msg, 0, buffer.size) - callback?.onMessageReceived(msg) + dataCacheHandler.post { + // 换一条线程处理 + callback?.onMessageReceived(msg) + } } }