iT邦幫忙

2026 iThome 鐵人賽

DAY 23
0
Software Development

從 Fragment 到 Compose — 老 Android App 重寫的架構取捨系列 第 23 篇

Day 23|端到端:拍照 → 佇列 → 上傳 → 進度

  • 分享至 

  • xImage
  •  

動筆前先答(兩題)

1.【模擬面試追問|規格與驗收】 文章寫到:使用者在交接畫面拍了三張照片,按「送出」。新 App 的流程是:壓縮 → 寫進佇列(Room)→ 排 WorkManager 上傳 → 三張都上傳完才呼叫業務 API → 完成。畫面顯示每張照片的狀態與整體進度。文章最後一句是「斷網測試通過」。

面試官順著這段往下問,請不看大綱作答:

  1. 把「有進度、斷網可重試」寫成驗收條件。列出一張照片從拍下到完成會經過的每個狀態,每個狀態畫面顯示什麼、使用者能按什麼(重試、刪除、離開)。三張照片的整體狀態怎麼從三個單張狀態算出來?「送出」鈕什麼時候能按、什麼時候變成「重試」、什麼時候消失?
  2. 「斷網測試通過」是在哪一層斷的網?(a) 實機開飛航模式;(b) MockWebServer 不回應或收完請求就斷線;(c) 把上傳目標換成回傳失敗的假物件;(d) 用 WorkManager 的測試工具讓網路約束不成立。每一層能證明什麼、不能證明什麼?哪些只能在實機做?
  3. 舊 App 在上傳前會先做三項預檢:系統回報有連線、系統驗證過這條連線能上網、DNS 查得到上傳主機(兩秒內)。三項都過才開始傳,否則直接告訴使用者「沒有網路」。新流程改靠 WorkManager 的「網路連上才執行」約束。遇到「有 Wi-Fi 訊號但實際連不出去」(例如要先登入網頁的熱點)時,兩種做法各自會發生什麼、使用者各自看到什麼?你要不要保留預檢?保留的話放在哪一層?
  4. 使用者同一時間有兩單的照片在排隊上傳。任務列表要不要顯示每一單的上傳狀態?佇列是依單排隊還是依照片排隊?一單的某張照片一直失敗,會不會卡住下一單?「一單完成」的定義是照片都上傳了,還是業務 API 也回成功了?

我的回答:(待補)

2.【決策邊界|平台能力】 假設需求(本專案目前沒有,照能力地圖改成決策邊界題):客戶要求每次交接完成後產出一份「交接單 PDF」,固定版面,壓上客戶的簽名圖、三張照片的縮圖、交接時間與使用者編號。交接完成時要當場讓客戶在手機上看到,之後寄到客戶信箱並留存。

有三種做法:

  • (A) App 端產生:用 Android 內建的 PdfDocument,把版面畫到 Canvas 上存成 PDF;產出的 PDF 跟照片一樣走 Day 21–22 的佇列上傳。
  • (B) 後端產生:App 只送結構化資料(簽名圖、照片、時間、編號),後端套版產生 PDF、寄信、留存;App 需要顯示時再下載。
  • (C) App 端用第三方 PDF 函式庫產生。

請寫下:

  • 預設選哪一個?在什麼條件下會改選另一個?至少想想這幾點:
    • 版面多久改一次?改版面是發 App 新版本,還是改後端?客戶要「當場看」時沒有網路怎麼辦?
    • 中文字型:PDF 要在客戶的任何裝置上正確顯示中文,字型必須內嵌。內嵌字型對 APK 大小、每份 PDF 的大小各有什麼影響?(B) 有沒有同樣的問題?
    • 簽名的可信度:客戶日後否認簽過,哪一種做法比較站得住腳?時間戳由誰給(手機時間可以改)?
    • 低階手機上,把三張照片縮圖與簽名畫進 Canvas 再編成 PDF:記憶體與時間的風險在哪?
    • 這份 PDF 該在「拍照 → 壓縮 → 佇列 → 上傳」管線的哪一步產生?它是佇列裡的另一個 item,還是上傳 Worker 的副產品?PDF 產生失敗要不要擋住交接完成?
  • 「當場讓客戶看」有兩種做法:用 PdfRenderer 把 (A) 產出的檔案畫出來,或直接用 Compose 畫同一個版面。差別在哪?哪一個才是客戶真正驗收的東西?
  • 如果最後選 (B),App 端還剩下哪些事要做?

我的回答:(待補)


上一篇
Day 22|上傳策略:重試、退避與進度
下一篇
Day 24|13 個掃描 Activity 收成一個 ScannerScreen:ML Kit + CameraX
系列文
從 Fragment 到 Compose — 老 Android App 重寫的架構取捨 共 24 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言