手邊有一台 Android 8 的舊平板,本來閒置,想說拿來當掛在牆上的地震速報顯示器。需求很單純:收到區域速報就亮紅底、播提示音,其他時間顯示最近一次地震的規模與位置。資料量不大,一天實際會觸發的事件頂多幾十筆,真正要即時反應的只有前幾秒。
我先確認資料來源的延遲,而不是先寫介面。做法是用一個每 5 秒抓一次端點的輪詢迴圈,把回應的 eventID 與本地快取比對,只有新事件才往下走:
last = None
while True:
r = requests.get(FEED, timeout=3)
ev = r.json()
if ev["id"] != last:
last = ev["id"]
notify(ev)
time.sleep(5)
平板端用 WebView 包一個極簡頁面,紅底與音效都在前端做,避免每次事件都重載。舊機的 WebView 版本很舊,所以只用了 fetch 與最基本的 DOM 操作,沒有框架。聲音用一個事先載入的短音檔,在使用者點過一次畫面後才能播放,這是行動瀏覽器的自動播放限制,繞不過去。
為什麼是輪詢而不是推播?這台機器的 Google 服務不穩,FCM 常常延遲甚至收不到,輪詢雖然浪費一點電,但行為可預測。代價是每 5 秒一次請求,事件多的時候會重複比對,而且平板休眠後迴圈會停,得用 setInterval 在前端補一次喚醒檢查。
會失效的地方有幾個。第一,如果端點沒有穩定的 eventID,只靠時間戳比對會漏事件;我自己就遇過同一事件更新了規模,結果被當成新事件重播。第二,網路斷線時輪詢會靜默失敗,頁面看起來一切正常,實際上已經停更,所以我加了一個「最後更新時間」的小字,超過兩分鐘沒動就變灰。第三,平板電池老化,插著電長期開著,半年後膨脹,這是實體層的坑,不是程式能解的。
你們把這類速報顯示放在哪種裝置上?有沒有遇過休眠後計時器停擺、或是端點事件 ID 不穩的情況?
0
赞同度 100% · 0 条评论 · 1 阅读
0 条评论
还没有评论,写下第一条。