diff --git a/app/src/main/java/com/example/kingway/ptt/CallBackUtil.java b/app/src/main/java/com/example/kingway/ptt/CallBackUtil.java index d8cae23..6cc97ce 100644 --- a/app/src/main/java/com/example/kingway/ptt/CallBackUtil.java +++ b/app/src/main/java/com/example/kingway/ptt/CallBackUtil.java @@ -1,9 +1,14 @@ package com.example.kingway.ptt; +import android.os.Handler; +import android.os.Looper; +import android.os.SystemClock; + import timber.log.Timber; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.ConcurrentHashMap; /**指令返回类 * 说明:操作UI请在主线程进行 @@ -11,6 +16,45 @@ import java.util.List; public class CallBackUtil { private static String TAG = "TYT_CallBackUtil"; + private static final long THROTTLE_INTERVAL_MS = 100L; + private static final Handler MAIN_HANDLER = new Handler(Looper.getMainLooper()); + private static final ConcurrentHashMap lastPushAt = new ConcurrentHashMap<>(); + private static final ConcurrentHashMap pendingRunnables = new ConcurrentHashMap<>(); + + private static void pushJsThrottled(String eventName, String script) { + long now = SystemClock.uptimeMillis(); + Long last = lastPushAt.get(eventName); + if (last == null || now - last >= THROTTLE_INTERVAL_MS) { + lastPushAt.put(eventName, now); + cancelPending(eventName); + com.stand.standapp.MainActivity.executeJs(script); + return; + } + Runnable prev = pendingRunnables.get(eventName); + if (prev != null) { + MAIN_HANDLER.removeCallbacks(prev); + } + final long scheduledAt = now; + Runnable task = () -> { + lastPushAt.put(eventName, SystemClock.uptimeMillis()); + pendingRunnables.remove(eventName); + com.stand.standapp.MainActivity.executeJs(script); + }; + pendingRunnables.put(eventName, task); + MAIN_HANDLER.postDelayed(task, THROTTLE_INTERVAL_MS - (now - last)); + } + + private static void cancelPending(String eventName) { + Runnable r = pendingRunnables.remove(eventName); + if (r != null) { + MAIN_HANDLER.removeCallbacks(r); + } + } + + private static void pushJsImmediate(String script) { + com.stand.standapp.MainActivity.executeJs(script); + } + /** * 返回登录 @@ -80,7 +124,7 @@ public class CallBackUtil { arr.put(obj); } } - com.stand.standapp.MainActivity.executeJs("if(window.onPttEvent){window.onPttEvent('MemberList', " + arr.toString() + ");}"); + pushJsThrottled("MemberList", "if(window.onPttEvent){window.onPttEvent('MemberList', " + arr.toString() + ");}"); } catch (Exception e) { Timber.tag(TAG).e(e, "Failed to push PTT event to JS"); } } @@ -138,7 +182,7 @@ public class CallBackUtil { obj.put("groupNo", dto.getGroupNo()); arr.put(obj); } - com.stand.standapp.MainActivity.executeJs("if(window.onPttEvent){window.onPttEvent('GroupList', " + arr.toString() + ");}"); + pushJsThrottled("GroupList", "if(window.onPttEvent){window.onPttEvent('GroupList', " + arr.toString() + ");}"); } catch (Exception e) { Timber.tag(TAG).e(e, "Failed to push PTT event to JS"); } } @@ -157,7 +201,7 @@ public class CallBackUtil { obj.put("groupName", groupName); obj.put("talkId", talkId); obj.put("talkName", talkName); - com.stand.standapp.MainActivity.executeJs("if(window.onPttEvent){window.onPttEvent('SpeakerUpdate', " + obj.toString() + ");}"); + pushJsThrottled("SpeakerUpdate", "if(window.onPttEvent){window.onPttEvent('SpeakerUpdate', " + obj.toString() + ");}"); } catch (Exception e) { Timber.tag(TAG).e(e, "Failed to push PTT event to JS"); } } @@ -171,7 +215,7 @@ public class CallBackUtil { obj.put("groupName", groupName); obj.put("talkId", talkId); obj.put("talkName", talkName); - com.stand.standapp.MainActivity.executeJs("if(window.onPttEvent){window.onPttEvent('PlayStatus', " + obj.toString() + ");}"); + pushJsThrottled("PlayStatus", "if(window.onPttEvent){window.onPttEvent('PlayStatus', " + obj.toString() + ");}"); } catch (Exception e) { Timber.tag(TAG).e(e, "Failed to push PTT event to JS"); } } @@ -211,7 +255,7 @@ public class CallBackUtil { obj.put("latitude", latitude); obj.put("longitude", longitude); obj.put("time", time); - com.stand.standapp.MainActivity.executeJs("if(window.onPttEvent){window.onPttEvent('LocationStatus', " + obj.toString() + ");}"); + pushJsThrottled("LocationStatus", "if(window.onPttEvent){window.onPttEvent('LocationStatus', " + obj.toString() + ");}"); } catch (Exception e) { Timber.tag(TAG).e(e, "Failed to push PTT event to JS"); } }