From: snickersun Date: Mon, 3 Feb 2020 04:42:41 +0000 (+0800) Subject: 修改Queue,采取同步锁的方式进行保护,解决之前lock锁死问题。 X-Git-Url: http://git.snicker.com.cn/?a=commitdiff_plain;h=aa189bb65bb961a7f725ecaea4b49c0ec1b63678;p=protocol_srv.git 修改Queue,采取同步锁的方式进行保护,解决之前lock锁死问题。 --- diff --git a/app/src/main/java/com/ic/protocol/LocationClient.java b/app/src/main/java/com/ic/protocol/LocationClient.java index 6c42132c..ddc37d44 100644 --- a/app/src/main/java/com/ic/protocol/LocationClient.java +++ b/app/src/main/java/com/ic/protocol/LocationClient.java @@ -412,7 +412,7 @@ public void updateCellInfo() { public void onReceive(StringMessage paramStringMessage) { Logger.i("LocationClient onReceive " +paramStringMessage.cmd() ); - Deliver.triggerSendThread(); +// Deliver.triggerSendThread(); //响应定位指令 if ("StartLocate".equals(paramStringMessage.cmd()) ){ forceLocation=1; diff --git a/app/src/main/java/com/ic/protocol/service/Deliver.java b/app/src/main/java/com/ic/protocol/service/Deliver.java index 5883c5a4..aa9a1be9 100644 --- a/app/src/main/java/com/ic/protocol/service/Deliver.java +++ b/app/src/main/java/com/ic/protocol/service/Deliver.java @@ -109,27 +109,76 @@ public class Deliver extends AbstractConnectionService { fileCache = new FileCache(paramRuntime.getFileDir()); initQueue(); } + + private static boolean checkNetwork(){ + boolean ret=true; + int signal=mRuntime.getSignalStrength(); + int networkType=SimSignalUtil.getInstance((mRuntime.getContextProxy()).context).getNetworkType(); + if (signal + 110 < getMinSignalStrength(networkType)) { + Logger.i("Skip Send for SignalStrengh "+(signal + 110 )+" < "+getMinSignalStrength(networkType)); + //如果信号不好,把msg放回去 + ret=false; + } else { + if (connection.isServerConnected() == false || !KeepAlive.isConnected) { + ret=false; + } + } + return ret; + } public static void triggerSendThread(){ if (mRuntime.getUseQueue()) { - mLock.lock(); - try { - mCondition.signal(); - - } finally { - mLock.unlock(); + lock.lock(); + try + { + String str; + //如果没有数据从缓存中尝试读取 + if (queue.isEmpty()) + loadMessage2Queue(); + if (!queue.isEmpty()) { + StringBuilder stringBuilder = new StringBuilder(); + if (checkNetwork()) { + StringMessage stringMessage = queue.poll(); + while (stringMessage != null) { + String cmd = stringMessage.isFromCache(); + stringBuilder.append(cmd); + stringBuilder.append("\n"); + if (checkNetwork()) { + connection.sendMsg(cmd); + stringMessage = queue.poll(); + } else { + //已经拿到的缓存,如果刚巧没有网络,就原路放回去 + ServiceUtil.offerQueue(stringMessage,true); + break; + } + } + } + str = stringBuilder.toString(); + } else { + str = null; + } + Logger.i("send cached cmd: \n"+str); + }finally { + lock.unlock(); } +// mLock.lock(); +// try { +// mCondition.signal(); +// +// } finally { +// mLock.unlock(); +// } } } MyThread2 mythread2=null; private void initQueue(){ - if (mRuntime.getUseQueue()) { - /*启动 阻塞队列buffer 发送县城,随时准备发送buffer的message*/ - if (mythread2 == null) - mythread2 = new MyThread2(this.mCondition, this.mLock); - mythread2.exitthread=false; - mythread2.start(); - } +// if (mRuntime.getUseQueue()) { +// /*启动 阻塞队列buffer 发送县城,随时准备发送buffer的message*/ +// if (mythread2 == null) +// mythread2 = new MyThread2(this.mCondition, this.mLock); +// mythread2.exitthread=false; +// mythread2.start(); +// } } private void deInitQueue(){