修改Queue,采取同步锁的方式进行保护,解决之前lock锁死问题。
authorsnickersun <snickersun@qq.com>
Mon, 3 Feb 2020 04:42:41 +0000 (12:42 +0800)
committersnickersun <snickersun@qq.com>
Mon, 3 Feb 2020 04:42:41 +0000 (12:42 +0800)
app/src/main/java/com/ic/protocol/LocationClient.java
app/src/main/java/com/ic/protocol/service/Deliver.java

index 6c42132..ddc37d4 100644 (file)
@@ -412,7 +412,7 @@ public void updateCellInfo() {
   public void onReceive(StringMessage paramStringMessage) {\r
 \r
     Logger.i("LocationClient onReceive " +paramStringMessage.cmd() );\r
-    Deliver.triggerSendThread();\r
+//    Deliver.triggerSendThread();\r
     //响应定位指令\r
     if ("StartLocate".equals(paramStringMessage.cmd())  ){\r
       forceLocation=1;\r
index 5883c5a..aa9a1be 100644 (file)
@@ -109,27 +109,76 @@ public class Deliver extends AbstractConnectionService {
     fileCache = new FileCache(paramRuntime.getFileDir());\r
     initQueue();\r
   }\r
+\r
+  private static boolean checkNetwork(){\r
+    boolean ret=true;\r
+    int signal=mRuntime.getSignalStrength();\r
+    int networkType=SimSignalUtil.getInstance((mRuntime.getContextProxy()).context).getNetworkType();\r
+    if (signal + 110 < getMinSignalStrength(networkType)) {\r
+      Logger.i("Skip Send for SignalStrengh "+(signal + 110 )+" < "+getMinSignalStrength(networkType));\r
+      //如果信号不好,把msg放回去\r
+      ret=false;\r
+    } else {\r
+      if (connection.isServerConnected() == false || !KeepAlive.isConnected) {\r
+        ret=false;\r
+      }\r
+    }\r
+    return ret;\r
+  }\r
   public static void triggerSendThread(){\r
     if (mRuntime.getUseQueue()) {\r
-      mLock.lock();\r
-      try {\r
-        mCondition.signal();\r
-\r
-      } finally {\r
-        mLock.unlock();\r
+      lock.lock();\r
+      try\r
+      {\r
+        String str;\r
+        //如果没有数据从缓存中尝试读取\r
+        if (queue.isEmpty())\r
+          loadMessage2Queue();\r
+        if (!queue.isEmpty()) {\r
+          StringBuilder stringBuilder = new StringBuilder();\r
+          if (checkNetwork()) {\r
+            StringMessage stringMessage = queue.poll();\r
+            while (stringMessage != null) {\r
+              String cmd = stringMessage.isFromCache();\r
+              stringBuilder.append(cmd);\r
+              stringBuilder.append("\n");\r
+              if (checkNetwork()) {\r
+                connection.sendMsg(cmd);\r
+                stringMessage = queue.poll();\r
+              } else {\r
+                //已经拿到的缓存,如果刚巧没有网络,就原路放回去\r
+                ServiceUtil.offerQueue(stringMessage,true);\r
+                break;\r
+              }\r
+            }\r
+          }\r
+          str = stringBuilder.toString();\r
+        } else {\r
+          str = null;\r
+        }\r
+        Logger.i("send cached cmd: \n"+str);\r
+      }finally {\r
+        lock.unlock();\r
       }\r
+//      mLock.lock();\r
+//      try {\r
+//        mCondition.signal();\r
+//\r
+//      } finally {\r
+//        mLock.unlock();\r
+//      }\r
     }\r
   }\r
   MyThread2 mythread2=null;\r
 \r
   private void initQueue(){\r
-    if (mRuntime.getUseQueue()) {\r
-      /*启动 阻塞队列buffer 发送县城,随时准备发送buffer的message*/\r
-      if (mythread2 == null)\r
-        mythread2 = new MyThread2(this.mCondition, this.mLock);\r
-      mythread2.exitthread=false;\r
-      mythread2.start();\r
-    }\r
+//    if (mRuntime.getUseQueue()) {\r
+//      /*启动 阻塞队列buffer 发送县城,随时准备发送buffer的message*/\r
+//      if (mythread2 == null)\r
+//        mythread2 = new MyThread2(this.mCondition, this.mLock);\r
+//      mythread2.exitthread=false;\r
+//      mythread2.start();\r
+//    }\r
   }\r
 \r
   private void deInitQueue(){\r