优化接收数据和处理数据分两条线程做

This commit is contained in:
tongchenfei
2020-09-23 14:53:16 +08:00
parent d811751442
commit 027d3b5d0a

View File

@@ -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<SimpleAddress, DatagramSocket>()
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)
}
}
}