优化接收数据和处理数据分两条线程做
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user