From b82fe124d8360f97442e43d5dd4372f2906743a6 Mon Sep 17 00:00:00 2001 From: huangfeng Date: Wed, 12 Mar 2025 11:48:55 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E8=B0=83=E6=95=B4registerHeartbeatTime?= =?UTF-8?q?r=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xypower/mpmaster/MpMasterService.java | 93 +++++++++---------- 1 file changed, 46 insertions(+), 47 deletions(-) diff --git a/mpmaster/src/main/java/com/xypower/mpmaster/MpMasterService.java b/mpmaster/src/main/java/com/xypower/mpmaster/MpMasterService.java index da06972b..bc85bb0f 100644 --- a/mpmaster/src/main/java/com/xypower/mpmaster/MpMasterService.java +++ b/mpmaster/src/main/java/com/xypower/mpmaster/MpMasterService.java @@ -50,6 +50,7 @@ import java.lang.reflect.Method; import java.nio.channels.FileLock; import java.text.SimpleDateFormat; import java.util.Arrays; +import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.logging.Level; @@ -764,67 +765,65 @@ public class MpMasterService extends Service { } private void registerHeartbeatTimer() { - - long timeout = mHeartbeatDuration; + long delaySec = 20; // 比i1延迟20秒 + long interval = mHeartbeatDuration; // 距离下一次间隔,默认10分钟 boolean keepAlive = false; - long currentTimeMs = System.currentTimeMillis(); + long currentSec = System.currentTimeMillis() / 1000; + if (mMntnMode) { + // 无延迟 + delaySec = 0; if (mQuickHbMode) { - timeout = mQuickHeartbeatDuration; + interval = mQuickHeartbeatDuration; } - registerHeartbeatTimer(currentTimeMs + timeout * 1000, keepAlive); + registerHeartbeatTimer((currentSec + interval + delaySec) * 1000, keepAlive); } else { - long closestTime = -1; if (mUsingAbsHbTime) { - Date dt = new Date(); - long ts = dt.getTime(); - ts -= ts % 1000; - - dt.setHours(0); - dt.setMinutes(0); - dt.setSeconds(0); - - long zeroPoint = dt.getTime(); - zeroPoint -= zeroPoint % 1000; - long offsetTs = (ts - zeroPoint) / 1000; - - if (mAbsHeartbeatTimes != null && mAbsHeartbeatTimes.length > 0) { - - for (int i = 0; i < mAbsHeartbeatTimes.length; i++) { - if (mAbsHeartbeatTimes[i] > offsetTs) { - closestTime = mAbsHeartbeatTimes[i]; - break; - } - } - - if (closestTime == -1) { - // next day - closestTime = mAbsHeartbeatTimes[0] + 86400; - } - } else { - closestTime = 9 * 3600 + 13 * 60; - if (offsetTs > closestTime) { - closestTime += 86400; - } - } - - if (zeroPoint + closestTime * 1000 > currentTimeMs + mMpHeartbeatDuration) { + long expandSec = 120; // 扩展2分钟之内的都触发 + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + long todayZero = calendar.getTimeInMillis() / 1000; + long todaySec = currentSec - todayZero; + + long nextAbsSec = this.getNextAbsSec(todaySec); + if (nextAbsSec - todaySec > interval + expandSec) { keepAlive = true; - registerHeartbeatTimer(currentTimeMs + mMpHeartbeatDuration + 5000, keepAlive); + registerHeartbeatTimer((currentSec + interval + delaySec) * 1000, keepAlive); } else { - registerHeartbeatTimer(zeroPoint + closestTime * 1000, keepAlive); + registerHeartbeatTimer((todayZero + nextAbsSec) * 1000, keepAlive); } } else { - // mUsingAbsHbTime: false - if ((mPreviousHeartbeatTime != 0) && (mPreviousHeartbeatTime - currentTimeMs < mHeartbeatDuration * 1000)) { - registerHeartbeatTimer(mPreviousHeartbeatTime + mHeartbeatDuration * 1000, keepAlive); - } else { - registerHeartbeatTimer(currentTimeMs + timeout * 1000, keepAlive); - } + // mUsingAbsHbTime=false,间隔10分钟 + 延迟 + registerHeartbeatTimer((currentSec + interval + delaySec) * 1000, keepAlive); } } } + private long getNextAbsSec(long todaySec) { + long nextAbsSec = -1; + if (mAbsHeartbeatTimes != null && mAbsHeartbeatTimes.length > 0) { + for (int i = 0; i < mAbsHeartbeatTimes.length; i++) { + if (mAbsHeartbeatTimes[i] > todaySec) { + nextAbsSec = mAbsHeartbeatTimes[i]; + break; + } + } + + if (nextAbsSec == -1) { + // next day + nextAbsSec = mAbsHeartbeatTimes[0] + 24 * 3600; + } + } else { + nextAbsSec = 9 * 3600 + 13 * 60; + if (todaySec > nextAbsSec) { + nextAbsSec += 24 * 3600; + } + } + return nextAbsSec; + } private void registerHeartbeatTimer(long triggerTime, boolean keepAlive) { AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);