fixed get data run on background cpu sleep issues.
authorTrillGates <williamtrillgates@gmail.com>
Sat, 16 Jan 2021 06:04:20 +0000 (14:04 +0800)
committerTrillGates <williamtrillgates@gmail.com>
Sat, 16 Jan 2021 06:04:20 +0000 (14:04 +0800)
app/IcL02WorkService/release/IcL02WorkService_V57_202101151444_release.apk [new file with mode: 0644]
app/IcL02WorkService/release/output.json
app/src/main/AndroidManifest.xml
app/src/main/aidl/com/ic/work/IHeartRateSensorService.aidl
app/src/main/aidl/com/ic/work/ITempSensorService.aidl
app/src/main/java/com/ic/work/SensorDataService.java
app/src/main/java/com/ic/work/WorkServiceApp.java
app/src/main/java/com/ic/work/hardware/BloodInfoHelper.java
app/src/main/java/com/ic/work/hardware/TemperatureHelper.java
app/src/main/java/com/ic/work/utils/HardwareUtils.java
app/src/main/java/com/ic/work/utils/TemperatureUtil.java

diff --git a/app/IcL02WorkService/release/IcL02WorkService_V57_202101151444_release.apk b/app/IcL02WorkService/release/IcL02WorkService_V57_202101151444_release.apk
new file mode 100644 (file)
index 0000000..5361343
Binary files /dev/null and b/app/IcL02WorkService/release/IcL02WorkService_V57_202101151444_release.apk differ
index 6888c7a..2967bc5 100644 (file)
@@ -1 +1 @@
-[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.1","enabled":true,"outputFile":"IcL02WorkService_V57_202101091515_release.apk","fullName":"IcL02WorkServiceRelease","baseName":"IcL02WorkService-release"},"path":"IcL02WorkService_V57_202101091515_release.apk","properties":{}}]
\ No newline at end of file
+[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.1","enabled":true,"outputFile":"IcL02WorkService_V57_202101151444_release.apk","fullName":"IcL02WorkServiceRelease","baseName":"IcL02WorkService-release"},"path":"IcL02WorkService_V57_202101151444_release.apk","properties":{}}]
\ No newline at end of file
index 53a38da..6571f55 100644 (file)
@@ -23,6 +23,7 @@
 
     <uses-permission android:name="android.permission.WRITE_SETTINGS" />
 
+    <uses-permission android:name="android.permission.WAKE_LOCK" />
     <!--用于申请调用A-GPS模块-->
     <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
     <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
index 70a7dd5..aa15d55 100644 (file)
@@ -6,5 +6,5 @@ import com.ic.work.IHeartRateSensorCallback;
 interface IHeartRateSensorService {
     void registerCallback(in IHeartRateSensorCallback callback,in String callbackTag);
     void unRegisterCallback(in IHeartRateSensorCallback callback);
-    oneway void getHeartRateInfo(int from,in String callbackTag);
+    void getHeartRateInfo(int from,in String callbackTag);
 }
\ No newline at end of file
index 4941edd..156a851 100644 (file)
@@ -5,5 +5,5 @@ import com.ic.work.ITempSensorCallback;
 interface ITempSensorService {
     void registerCallback(in ITempSensorCallback callback,in String callbackTag);
     void unRegisterCallback(in ITempSensorCallback callback);
-    oneway void getTemperatureInfo(int from,in String callbackTag);
+    void getTemperatureInfo(int from,in String callbackTag);
 }
\ No newline at end of file
index a93f5c5..dfa25d4 100644 (file)
@@ -3,6 +3,7 @@ package com.ic.work;
 import android.app.Service;
 import android.content.Intent;
 import android.os.IBinder;
+import android.os.PowerManager;
 import android.os.RemoteCallbackList;
 import android.os.RemoteException;
 import android.util.Log;
@@ -17,6 +18,7 @@ import com.ic.work.event.TestTaskEvent;
 import com.ic.work.hardware.BloodInfoHelper;
 import com.ic.work.hardware.BloodSensorManager;
 import com.ic.work.hardware.TemperatureHelper;
+import com.ic.work.utils.ICLogger;
 import com.ic.work.utils.ICWorkConstants;
 import com.ic.work.utils.IcLog;
 import com.ic.work.utils.IcSystemProperty;
@@ -53,7 +55,6 @@ public class SensorDataService extends Service implements TemperatureHelper.Temp
     public static final String KEY_TEMP_WRIST = "wrist";  //  double 腕温
     public static final String KEY_TEMP_OUT = "out";  //  double 腕温
     private static final String HEART_ACTION = "com.ic.action.BLOOD_HEART";
-
     private static final String TAG = "SensorDataService";
     private final LinkedBlockingDeque<TestTaskEvent> mTaskList = new LinkedBlockingDeque<>();
 
@@ -62,9 +63,9 @@ public class SensorDataService extends Service implements TemperatureHelper.Temp
     //当前执行的任务
     private TestTaskEvent currentTask;
     private BloodSensorManager bloodSensorManager;
-
     private final Object mLock = new Object();
-
+    private PowerManager powerManager;
+    private PowerManager.WakeLock wakeLock;
 
     @Nullable
     @Override
@@ -74,7 +75,7 @@ public class SensorDataService extends Service implements TemperatureHelper.Temp
         //其他的进行action判断
         String action = intent.getAction();
         IcLog.d(TAG, "on service bind package name -- > "
-                + packageName + " action name is -==- > " + action);
+                + packageName + " action name is == > " + action);
         if (ACTION_BLOOD.equals(packageName) ||
                 ICWorkConstants.SensorServiceAction.ACTION_HEART_RATE.equals(action)) {
             return heartRateSensorService;
@@ -87,10 +88,10 @@ public class SensorDataService extends Service implements TemperatureHelper.Temp
         return null;
     }
 
-
     @Override
     public void onCreate() {
         super.onCreate();
+        powerManager = (PowerManager) WorkServiceApp.sContext.getSystemService(POWER_SERVICE);
         EventBus.getDefault().register(this);
         //创建一个Handler用来计算超时,如果超过这个时间,还没有执行完
         //那么就取出下一个任务
@@ -98,6 +99,7 @@ public class SensorDataService extends Service implements TemperatureHelper.Temp
         BloodInfoHelper.getInstance().setHeartRateInfoChangeListener(this);
     }
 
+
     /**
      * 此方法已经是子线程了,不可以再开子线程,包括结果的处理。
      * 这样才可以确保单一的一个任务执行,解决并发读取数据不准的问题。
@@ -108,6 +110,9 @@ public class SensorDataService extends Service implements TemperatureHelper.Temp
      */
     @Subscribe(threadMode = ThreadMode.BACKGROUND)
     public void handleTestEvent(TestTaskEvent testTaskEvent) {
+        //保持CPU运行
+        wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ic:sensorDataService");
+        wakeLock.acquire(10 * 60 * 1000L /*10 minutes*/);
         IcLog.d(TAG, "task == start == > " + testTaskEvent);
         //当结果回来的时候,如果队列里没有了,那么就false了
         isRunning = true;
@@ -179,6 +184,7 @@ public class SensorDataService extends Service implements TemperatureHelper.Temp
     public void onDestroy() {
         super.onDestroy();
         mTaskList.clear();
+        powerManager = null;
         EventBus.getDefault().unregister(this);
         TemperatureHelper.getInstance().setTemperatureChangeListener(null);
         BloodInfoHelper.getInstance().setHeartRateInfoChangeListener(null);
@@ -192,11 +198,13 @@ public class SensorDataService extends Service implements TemperatureHelper.Temp
             new IHeartRateSensorService.Stub() {
                 @Override
                 public void registerCallback(IHeartRateSensorCallback callback, String tag) {
+                    ICLogger.d("heartRateSensorService registerCallback ==> " + callback);
                     heartRateCallbacks.register(callback, tag);
                 }
 
                 @Override
                 public void unRegisterCallback(IHeartRateSensorCallback callback) {
+                    ICLogger.d("heartRateSensorService unRegisterCallback ==> " + callback);
                     heartRateCallbacks.unregister(callback);
                 }
 
@@ -225,12 +233,14 @@ public class SensorDataService extends Service implements TemperatureHelper.Temp
     private final ITempSensorService.Stub tempSensorService = new ITempSensorService.Stub() {
         @Override
         public void registerCallback(ITempSensorCallback callback, String tag) {
+            ICLogger.d("tempSensorService registerCallback ==> " + callback);
             temperatureCallbacks.register(callback, tag);
         }
 
         @Override
         public void unRegisterCallback(ITempSensorCallback callback) {
             temperatureCallbacks.unregister(callback);
+            ICLogger.d("tempSensorService unRegisterCallback ==> " + callback);
         }
 
         @Override
@@ -242,45 +252,49 @@ public class SensorDataService extends Service implements TemperatureHelper.Temp
         }
     };
 
+    private final Object mTaskLock = new Object();
+
     private void createTask(int from, TestTaskEvent.SensorType censorType, String tag) {
         TestTaskEvent.From fromByValue = getFromByValue(from);
         if (fromByValue == null) {
-            IcLog.d(TAG, "from is not invalid..." + from);
+            IcLog.d(TAG, "from is not invalid..." + from + tag);
             return;
         }
         TestTaskEvent taskEvent = new TestTaskEvent(censorType, fromByValue, System.currentTimeMillis());
         IcLog.d(TAG, "create new task == > " + taskEvent);
-        //判断队列里是否有同样的任务,如果有的话不用发了,
-        if (mTaskList.contains(taskEvent)) {
-            IcLog.d(TAG, "task contains..." + fromByValue);
-            //通知正在等待执行
-            if (tag != null) {
-                dispatchWaiting(censorType, tag);
+        synchronized (mTaskLock) {
+            //判断队列里是否有同样的任务,如果有的话不用发了,
+            if (mTaskList.contains(taskEvent)) {
+                IcLog.d(TAG, "task contains..." + fromByValue);
+                //通知正在等待执行
+                if (tag != null) {
+                    dispatchWaiting(censorType, tag);
+                }
+                return;
             }
-            return;
-        }
-        if (taskEvent.equals(currentTask)) {
-            IcLog.d(TAG, "current task running...");
-            //通知正在执行
-            if (tag != null) {
-                dispatchTaskRunning(censorType, tag);
+            if (taskEvent.equals(currentTask)) {
+                IcLog.d(TAG, "current task running...");
+                //通知正在执行
+                if (tag != null) {
+                    dispatchTaskRunning(censorType, tag);
+                }
+                return;
             }
-            return;
-        }
-        IcLog.d(TAG, "is running =-== > " + isRunning + "  queue size == > " + mTaskList.size());
-        //判断是否繁忙
-        //如果没有的话则发送一下
-        if (!isRunning && mTaskList.size() == 0) {
-            currentTask = taskEvent;
-            //直接运行不需要放到队列里了
-            EventBus.getDefault().post(taskEvent);
-        } else {
-            IcLog.d(TAG, "new task waiting..." + taskEvent);
-            //要放到队列里头,提示调用者正在等待执行
-            if (tag != null) {
-                dispatchWaiting(censorType, tag);
+            IcLog.d(TAG, "is running =-== > " + isRunning + "  queue size == > " + mTaskList.size());
+            //判断是否繁忙
+            //如果没有的话则发送一下
+            if (!isRunning && mTaskList.size() == 0) {
+                currentTask = taskEvent;
+                //直接运行不需要放到队列里了
+                EventBus.getDefault().post(taskEvent);
+            } else {
+                IcLog.d(TAG, "new task waiting..." + taskEvent);
+                //要放到队列里头,提示调用者正在等待执行
+                if (tag != null) {
+                    dispatchWaiting(censorType, tag);
+                }
+                mTaskList.add(taskEvent);
             }
-            mTaskList.add(taskEvent);
         }
     }
 
@@ -404,6 +418,7 @@ public class SensorDataService extends Service implements TemperatureHelper.Temp
     }
 
     private void checkContinue() {
+        wakeLock.release();
         isRunning = false;
         currentTask = null;
         int size = mTaskList.size();
index 9930cf9..6803877 100644 (file)
@@ -1,6 +1,7 @@
 package com.ic.work;
 
 import android.app.Application;
+import android.content.Context;
 
 import com.ic.work.db.AppDatabase;
 import com.ic.work.db.PedInjection;
@@ -11,6 +12,10 @@ import com.jakewharton.threetenabp.AndroidThreeTen;
 
 public class WorkServiceApp extends Application {
 
+
+    public static Context sContext = null;
+
+
     @Override
     public void onCreate() {
         super.onCreate();
@@ -20,6 +25,7 @@ public class WorkServiceApp extends Application {
 
         CrashHandler crashHandler = CrashHandler.getInstance();
         crashHandler.init(getApplicationContext());
+        sContext = getApplicationContext();
     }
 
     public AppDatabase getDatabase() {
index b4b4b82..49c1fcd 100644 (file)
@@ -1,20 +1,14 @@
 package com.ic.work.hardware;
 
-import com.ic.work.event.BloodCheckTipsEvent;
-import com.ic.work.event.BloodSensorEvent;
+import android.os.Handler;
+import android.os.HandlerThread;
+
 import com.ic.work.utils.HardwareUtils;
+import com.ic.work.utils.ICLogger;
 import com.ic.work.utils.IcLog;
 
-import org.greenrobot.eventbus.EventBus;
-
 import java.util.Random;
 
-import static com.ic.aidl.blood.BloodState.BLOOD_ING_CHECK;
-import static com.ic.aidl.blood.BloodState.BLOOD_NOT_DEVICE;
-import static com.ic.aidl.blood.BloodState.BLOOD_NULL_TIPS;
-import static com.ic.aidl.blood.BloodState.BLOOD_PLEASE_QUIET;
-import static com.ic.aidl.blood.BloodState.BLOOD_START_CHECK;
-
 /**
  * 此工具类获取血氧,血压,心率等信息,结果通过:
  */
@@ -22,9 +16,14 @@ public class BloodInfoHelper {
 
 
     private HeartRateInfoChangeListener mListener = null;
+    private final Handler ppgLooper;
+    private long checkBloodStartTime;
 
     private BloodInfoHelper() {
-
+        //这个Looper专门用来查询数据的
+        HandlerThread handlerThread = new HandlerThread("ic:heart-rate-looper");
+        handlerThread.start();
+        ppgLooper = new Handler(handlerThread.getLooper());
     }
 
     private static BloodInfoHelper sInstance = null;
@@ -44,106 +43,145 @@ public class BloodInfoHelper {
     private static final String TAG = "BloodInfoHelper";
 
     public void getBloodInfo() {
+        ICLogger.d("getBloodInfo...");
         boolean[] deviceState = HardwareUtils.isPPGavailableIc66();
 
         if (!deviceState[0]) {
+            IcLog.d(TAG, "deviceState[0] == > " + deviceState[0]);
             //TODO:这个后面再处理,得给我机器再去处理,没有文档,没有数据
-            sendTipsEventBus(BLOOD_NULL_TIPS, BLOOD_NOT_DEVICE);
+            //sendTipsEventBus(BLOOD_NULL_TIPS, BLOOD_NOT_DEVICE);
             return;
         }
 
+        ICLogger.d("deviceState[1]..." + deviceState[1]);
         if (deviceState[1]) {
             //TODO:这个是走官方API的,也得有机器再进行修改代码
-            sendTipsEventBus(BLOOD_PLEASE_QUIET, BLOOD_START_CHECK);
-            EventBus.getDefault().post(new BloodSensorEvent(1));
+            //sendTipsEventBus(BLOOD_PLEASE_QUIET, BLOOD_START_CHECK);
+            // EventBus.getDefault().post(new BloodSensorEvent(1));
         } else {
             //这个走JNI获取数据的,完成了
             checkBloodOther();
         }
     }
 
-    private void sendTipsEventBus(int top, int bottom) {
-        EventBus.getDefault().post(new BloodCheckTipsEvent(top, bottom));
-    }
-
-
-    private void checkBloodOther() {
-        int ndkHeart = 0;
-        int ndkHigh = 0;
-        int ndkLow = 0;
-        int oxygen = 0;
+    private int ndkHeart = 0;
+    private int ndkHigh = 0;
+    private int ndkLow = 0;
+    private int oxygen = 0;
+    private int checkCount = 0;
+    private int noWearCount = 0;
 
-        boolean isWeared;
+    private boolean isWear;
 
-        int checkCount = 0;
-        int noWearCount = 0;
-        boolean isSendCheckTips = false;
+    private int invalidateTime = 0;
 
+    private void checkBloodOther() {
+        checkBloodStartTime = System.currentTimeMillis();
+        IcLog.d(TAG, "start time == > " + checkBloodStartTime);
+        ndkHeart = 0;
+        ndkHigh = 0;
+        ndkLow = 0;
+        oxygen = 0;
+        checkCount = 0;
+        noWearCount = 0;
+        invalidateTime = 0;
         //开启
         HardwareUtils.onNdkEnablePPG();
+        //推迟1秒去测试数据
+        //测试数据是一个循环,有三种情况
+        //- 没有穿戴,如果超过20秒没有穿戴,那么就结束此次测试
+        //- 数据测试结果为0,如果连续20个数据为0,那么就结束此次测试
+        //- 有数据以后,连续测上10次,就可以返回结果了
+        ppgLooper.postDelayed(this::checkWear, 1000);
+    }
 
-        sendTipsEventBus(BLOOD_PLEASE_QUIET, BLOOD_START_CHECK);
-
-        int invalidateTime = 0;
-        try {
-            while (!Thread.currentThread().isInterrupted()) {
+    private void checkWear() {
+        IcLog.d(TAG, "checkWear...");
+        //测试数据是一个循环,有三种情况
+        //- 没有穿戴,如果超过20秒没有穿戴,那么就结束此次测试
+        //- 20秒内有穿戴,则开始测试
+        ppgLooper.post(new Runnable() {
+            @Override
+            public void run() {
                 ndkHeart = HardwareUtils.getNdkPPGValue();
-                isWeared = HardwareUtils.isWeared();
-
-                IcLog.i(TAG, "Get Heart Value:" + isWeared + ",ndkHeart:" + ndkHeart);
-
-                if (!isWeared) {
-                    //超过10连续未佩戴则认为没有佩戴
-                    if (noWearCount > 10) break;
+                isWear = HardwareUtils.isWeared();
+                IcLog.d(TAG, "isWear == > " + isWear);
+                if (!isWear) {
+                    //延时1秒进行检查
                     noWearCount++;
+                    IcLog.d(TAG, "noWearCount == > " + noWearCount);
+                    if (noWearCount <= 20) {
+                        ppgLooper.postDelayed(this, 1000);
+                    } else {
+                        handleResult();
+                    }
                 } else {
-                    //已佩戴则noWearCount 清零重新计数
                     noWearCount = 0;
-                    if (ndkHeart > 0) {
-                        ndkHigh = HardwareUtils.getNdkHighBloodValue();
-                        ndkLow = HardwareUtils.getNdkLowBloodValue();
-                        oxygen = HardwareUtils.getNdkOxygenValue();
-                        if (oxygen <= 0) oxygen = randomOxygenValue();
-                        if (mListener != null) {
-                            mListener.onHeartRateUpdate(ndkHigh, ndkLow, ndkHeart, oxygen);
-                        }
-                        //测试到数据30秒后停止测量
-                        if (checkCount >= 30) {
-                            break;
-                        }
-                        checkCount++;
+                    //开始去检测了
+                    doTest();
+                }
+            }
+        });
+    }
+
+    //- 数据测试结果为0,如果连续20个数据为0,那么就结束此次测试
+    //- 有数据以后,连续测上10次,就可以返回结果了
+    private void doTest() {
+        ppgLooper.post(new Runnable() {
+            @Override
+            public void run() {
+                //这部分代码要做超时处理{
+                long getPPGStartTime = System.currentTimeMillis();
+                ndkHeart = HardwareUtils.getNdkPPGValue();
+                if (ndkHeart > 0) {
+                    ndkHigh = HardwareUtils.getNdkHighBloodValue();
+                    ndkLow = HardwareUtils.getNdkLowBloodValue();
+                    oxygen = HardwareUtils.getNdkOxygenValue();
+                    if (oxygen <= 0) oxygen = randomOxygenValue();
+                    if (mListener != null) {
+                        IcLog.d(TAG, "ndkHigh == > " + ndkHigh + "ndkLow == > " + ndkLow + "oxygen == > " + oxygen);
+                        mListener.onHeartRateUpdate(ndkHigh, ndkLow, ndkHeart, oxygen);
+                    }
+                    checkCount++;
+                    IcLog.d(TAG, "checkCount == > " + checkCount);
+                    if (checkCount <= 10) {
+                        //继续测试
+                        ppgLooper.postDelayed(this, 1000);
                     } else {
-                        //如果为0的话,记录下来
-                        invalidateTime++;
+                        handleResult();
                     }
-                    if (!isSendCheckTips) {
-                        //正在测量中,请稍等
-                        sendTipsEventBus(BLOOD_PLEASE_QUIET, BLOOD_ING_CHECK);
-                        isSendCheckTips = true;
+                    IcLog.d(TAG, "use time == > " + (System.currentTimeMillis() - getPPGStartTime));
+                } else {
+                    //如果为0的话,记录下来
+                    invalidateTime++;
+                    IcLog.d(TAG, "invalidateTime == > " + invalidateTime);
+                    if (invalidateTime <= 30) {
+                        ppgLooper.postDelayed(this, 1000);
+                    } else {
+                        handleResult();
                     }
                 }
-                Thread.sleep(1000);
-                if (invalidateTime > 20) {
-                    break;
-                }
-            }
-            if (mListener != null) {
-                mListener.onHeartRateResult(ndkHigh, ndkLow, ndkHeart, oxygen);
-            }
-            if (mListener != null) {
-                mListener.onHeartRateTestFinished();
             }
-            HardwareUtils.onNdkDisablePPG();
-        } catch (InterruptedException e) {
-            IcLog.e(TAG, "Stop Get Heart Value", e);
-        } catch (Exception e) {
-            e.printStackTrace();
-        } finally {
+        });
+    }
+
+    private void handleResult() {
+        if (mListener != null) {
+            mListener.onHeartRateResult(ndkHigh, ndkLow, ndkHeart, oxygen);
+        }
+        if (mListener != null) {
+            mListener.onHeartRateTestFinished();
+        }
+        try {
             IcLog.d(TAG, "disable ppg..");
             HardwareUtils.onNdkDisablePPG();
+        } catch (Exception e) {
+            IcLog.e(TAG, "Stop Get Heart Value", e);
         }
+        IcLog.d(TAG, "total use time == checkBloodStartTime > " + (System.currentTimeMillis() - checkBloodStartTime));
     }
 
+
     private int randomOxygenValue() {
         int min = 95;
         int max = 100;
index e6750d1..234bc54 100644 (file)
@@ -2,9 +2,15 @@ package com.ic.work.hardware;
 
 import com.ic.work.domain.TemperatureItem;
 import com.ic.work.utils.HardwareUtils;
+import com.ic.work.utils.ICLogger;
 import com.ic.work.utils.IcLog;
 import com.ic.work.utils.TemperatureUtil;
 
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+
 /**
  * 获取温度的工具类
  */
@@ -31,11 +37,17 @@ public class TemperatureHelper {
         return sInstance;
     }
 
+    private double lastTempOut = 0.0;
+    private double lastBodyTemp = 0.0;
+    private double lastWristTemp = 0.0;
+    private int delayTimesInSeconds = 20;
+
     public void getTemperature() {
-        double lastTempOut = 0.0;
-        double lastBodyTemp = 0.0;
-        double lastWristTemp = 0.0;
-        int delayTimesInSeconds = 20;
+        long start = System.currentTimeMillis();
+        lastTempOut = 0.0;
+        lastBodyTemp = 0.0;
+        lastWristTemp = 0.0;
+        delayTimesInSeconds = 20;
         boolean[] state = HardwareUtils.isTemperatureDevAvailable();
         IcLog.i(TAG, "TemperatureRunnable :" + state[0] + " state[1]:" + state[1]);
         if (state[0]) {  //have temp
@@ -44,46 +56,70 @@ public class TemperatureHelper {
                 HardwareUtils.disablePedometer();
                 if (HardwareUtils.enableTemperature()) {
                     IcLog.i(TAG, "getNdkTemperatureValue  enableTemperature");
-                    Thread.sleep(1000);
+                    long begin = System.currentTimeMillis();
+                    while (true) {
+                        if (System.currentTimeMillis() - begin > 1000) {
+                            break;
+                        }
+                    }
                 }
+                //这里做超时处理
+                ExecutorService executor = Executors.newSingleThreadExecutor();
                 while (true) {
-                    lastWristTemp = HardwareUtils.getNdkTemperatureOutValue();
-                    TemperatureItem temperatureItem = TemperatureUtil.doTempTest();
-                    if (temperatureItem != null) {
-                        lastWristTemp = Double.parseDouble(temperatureItem.getBodyTemp());
-                        lastTempOut = Double.parseDouble(temperatureItem.getEvnTemp());
-
-                        if (lastTempOut > 60 || lastTempOut < 1) {
-                            lastTempOut = 0.0f;
-                        }
-                        if (lastTempOut > 0.0f) {
-                            lastBodyTemp = TemperatureUtil.getBodyTemp(lastWristTemp, lastTempOut);
-                        } else {
-                            lastBodyTemp = TemperatureUtil.getBodyTemp(lastWristTemp, 26.0f);
+                    Future<?> submit = executor.submit(() -> {
+                        IcLog.d(TAG, "do temperature....");
+                        long begin = System.currentTimeMillis();
+                        while (true) {
+                            if (System.currentTimeMillis() - begin > 1000) {
+                                break;
+                            }
                         }
-                        IcLog.d(TAG, "testing..." + lastWristTemp + " " + lastBodyTemp + " " + lastTempOut);
-                        //前10秒不更新内容,后10秒再更新数据
-                        if (delayTimesInSeconds > 10 && mListener != null) {
-                            IcLog.d(TAG, "update temperature info..thread name is ." + Thread.currentThread().getName());
-                            //获取
-                            IcLog.d(TAG, "lastWristTemp == > " + lastWristTemp);
-                            IcLog.d(TAG, "lastBodyTemp == > " + lastBodyTemp);
-                            IcLog.d(TAG, "lastTempOut == > " + lastTempOut);
-                            mListener.onTemperatureUpdate(lastWristTemp, lastBodyTemp, lastTempOut);
+                        long getStartTime = System.currentTimeMillis();
+                        lastWristTemp = HardwareUtils.getNdkTemperatureOutValue();
+                        TemperatureItem temperatureItem = TemperatureUtil.doTempTest();
+                        if (temperatureItem != null) {
+                            lastWristTemp = Double.parseDouble(temperatureItem.getBodyTemp());
+                            lastTempOut = Double.parseDouble(temperatureItem.getEvnTemp());
+
+                            if (lastTempOut > 60 || lastTempOut < 1) {
+                                lastTempOut = 0.0f;
+                            }
+                            if (lastTempOut > 0.0f) {
+                                lastBodyTemp = TemperatureUtil.getBodyTemp(lastWristTemp, lastTempOut);
+                            } else {
+                                lastBodyTemp = TemperatureUtil.getBodyTemp(lastWristTemp, 26.0f);
+                            }
+                            IcLog.d(TAG, "testing..." + lastWristTemp + " " + lastBodyTemp + " " + lastTempOut);
+                            //前10秒不更新内容,后10秒再更新数据
+                            if (delayTimesInSeconds <= 10 && mListener != null) {
+                                IcLog.d(TAG, "update temperature info..thread name is ." + Thread.currentThread().getName());
+                                //获取
+                                IcLog.d(TAG, "lastWristTemp == > " + lastWristTemp);
+                                IcLog.d(TAG, "lastBodyTemp == > " + lastBodyTemp);
+                                IcLog.d(TAG, "lastTempOut == > " + lastTempOut);
+                                mListener.onTemperatureUpdate(lastWristTemp, lastBodyTemp, lastTempOut);
+                            }
+                            ICLogger.d("get temperature data use time == > " + (System.currentTimeMillis() - getStartTime));
                         }
-                    }
-                    //}
+                    });
+
                     try {
-                        Thread.sleep(1000);
-                    } catch (InterruptedException e) {
-                        break;
+                        ICLogger.d("start to get temperature data...");
+                        submit.get(10, TimeUnit.SECONDS);
+                        ICLogger.d("to get temperature end...");
+                    } catch (Exception e) {
+                        ICLogger.d("get temperature data time out...");
+                        continue;
                     }
                     delayTimesInSeconds--;
+                    IcLog.d(TAG, "delayTimesInSeconds " + delayTimesInSeconds);
                     //延时delay_times_in_seconds秒后停止检测。
-                    if (delayTimesInSeconds <= 0)
+                    if (delayTimesInSeconds <= 0) {
                         break;
+                    }
                 }
-            } catch (InterruptedException e) {
+                executor.shutdown();
+            } catch (Exception e) {
                 IcLog.e(TAG, "TemperatureRunnable :", e);
             } finally {
                 HardwareUtils.disableTemperature();
@@ -93,8 +129,10 @@ public class TemperatureHelper {
             }
         }
         if (mListener != null) {
+            ICLogger.d("result == >lastWristTemp " + lastWristTemp + " lastBodyTemp" + lastBodyTemp + " lastTempOut" + lastTempOut);
             mListener.onTemperatureResult(lastWristTemp, lastBodyTemp, lastTempOut);
         }
+        IcLog.d(TAG, "temp use time == > " + (System.currentTimeMillis() - start));
     }
 
     public void setTemperatureChangeListener(TemperatureChangeListener listener) {
index 6ecf0c7..b39a7f5 100644 (file)
@@ -1,7 +1,6 @@
 package com.ic.work.utils;
 
 import com.ic.jni.ICJniUtils;
-import com.ic.work.BuildConfig;
 
 public class HardwareUtils {
 
@@ -49,12 +48,7 @@ public class HardwareUtils {
     public static boolean isWeared() {
         try {
             int value = ICJniUtils.isWeared();
-//            if(BuildConfig.productType == 1002){
             return value == 1;
-//            }else{
-//                return value == 0;
-//            }
-
         } catch (Exception e) {
             IcLog.e(TAG, "", e);
             return true;
index 0e75137..6838272 100644 (file)
@@ -25,36 +25,10 @@ public class TemperatureUtil {
     }
 
 
-    public static void enableTemp() {
-        if (ICJniUtils.isTemperatureDevAvailable() > ICJniUtils.TempSensorType.TEMPSENSOR_TYPE_NONE.ordinal()) {
-
-            ICJniUtils.disablePedometer();
-            ICJniUtils.enableTemperature();
-            mSleep(1000);
-        }
-
-    }
-
     public static double getBodyTemp(double wristtemp, double envtemp) {
         return ICJniUtils.getBodyTempFromWristTemp(wristtemp, envtemp);
     }
 
-    public static void disableTemp() {
-        if (ICJniUtils.isTemperatureDevAvailable() > ICJniUtils.TempSensorType.TEMPSENSOR_TYPE_NONE.ordinal()) {
-            ICJniUtils.disableTemperature();
-            ICJniUtils.enablePedometer();
-        }
-    }
-
-    public static void mSleep(int ms) {
-        try {
-            Thread.yield();
-            Thread.sleep(ms);
-        } catch (Exception e) {
-            // Log.e(TAG,e.getMessage(),e);
-        }
-    }
-
 
     //thermal_zone0
     public static final String CMD_CPU_TEM = "/sys/class/thermal/thermal_zone0/temp";