首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android 客戶端圖片緩存與服務端數據同步策略

     編輯:程式設計疑難解答

核心矛盾

服務端數據更新 → 客戶端磁盤緩存失效 → 用戶看到舊圖/舊列表。

同步觸發機制對比

策略觸發方式實時性實現複雜度適用場景
用戶操作觸發下拉刷新、進入頁面、點擊重試低極低非強實時、內容型 App
定時輪詢AlarmManager / WorkManager 定期請求版本號中 (分鐘級)低資訊流、社區
服務端推送FCM / WebSocket / 長連接推送版本變更通知高 (秒級)高IM、交易、協作
版本號/ETag 機制請求攜帶本地版本,服務端 304 或返回增量配合上述中所有場景必備

緩存失效與更新流程

// 1. 客戶端請求列表
GET /api/items?version=123&since=20240101

// 2. 服務端響應
// 情況 A: 無變更
HTTP 304 Not Modified
// 情況 B: 有變更
HTTP 200 OK
{
  "version": 125,
  "deleted_ids": [1001, 1002],     // 刪除標識
  "updated": [                     // 新增/修改
    {"id": 1005, "img_url": "https://cdn.com/new.jpg", "v": 5},
    ...
  ]
}

// 3. 客戶端處理
// - 遍歷 deleted_ids → 磁盤緩存刪除對應文件、數據庫標記刪除
// - 遍歷 updated → 下載新圖 (Glide/Picasso/Coil 自動處理磁盤緩存 Key)
// - 更新本地 version = 125

圖片級緩存 Key 設計關鍵

  • **URL 包含版本/哈希**:https://cdn.com/img.jpg?v=5 或 https://cdn.com/img_.jpg。
  • 圖片加載庫 (Glide/Coil) 以 **完整 URL 為 Key** 緩存。
  • 服務端更新圖片 → **生成新 URL** → 客戶端視為新資源自動下載,**無需手動清理舊緩存** (LRU 策略自動淘汰)。

推薦架構:版本號 + 推送 + 增量同步

// 服務端
class ItemService {
    void updateItem(Item item) {
        item.setVersion(versionGenerator.next()); // 全局遞增版本號
        item.setImgUrl(cdn.upload(newImage));     // 新 URL
        db.save(item);
        pushService.notifyVersionChange(item.getCategory(), item.getVersion());
    }
}

// 客戶端 WorkManager 任務
@HiltWorker
class SyncWorker @AssistedInject constructor(
    @Assisted Context context, @Assisted WorkerParameters params,
    ApiService api, LocalDb db, PushTokenManager tokenMgr
) : CoroutineWorker(context, params) {
    override suspend fun doWork(): Result {
        val localVersion = db.getVersion("category")
        val response = api.getIncremental("category", localVersion)
        if (response.is304) return Result.success()
        db.applyIncremental(response.body()) // 刪除/更新/插入
        return Result.success()
    }
}

// FCM 接收推送 → 觸發立即同步
class MyFirebaseMessagingService : FirebaseMessagingService() {
    override fun onMessageReceived(message: RemoteMessage) {
        if (message.data["type"] == "version_change") {
            WorkManager.enqueueUniqueWork("sync_" + message.data["category"], 
                ExistingWorkPolicy.REPLACE, OneTimeWorkRequestBuilder().build())
        }
    }
}

總結

  1. 圖片 URL 帶版本/哈希 → 利用加載庫自動緩存機制,無需手動清理。
  2. 列表數據用版本號/ETag → 支持增量同步,減少流量。
  3. 觸發方式分級:推送即時觸發 + 定時兜底 + 用戶操作手動刷新。
  4. 刪除數據同步:服務端返回 deleted_ids,客戶端清理本地緩存與數據庫。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved