Cache və offline-first strategiyalar
Cache strategiyaları müsahibədə "tətbiqin interneti zəif olanda necə davranır?" sualının arxasında dayanır:
- Cache-then-network (stale-while-revalidate) — əvvəl cache göstər, paralel yenilə, gələndə əvəz et. Ən yaxşı UX; balans ekranında "köhnəlik" göstəricisi ilə.
- Network-first, cache fallback — əvvəl şəbəkə, alınmasa cache. Kritik dəqiqlik tələb edən yerlərdə.
- Cache-only / Network-only — xüsusi hallar (offline rejim / ödəniş əməliyyatı).
Qatlar üzrə cache:
- HTTP cache (OkHttp) —
Cache-Controlheader-lərinə əsaslanır; server dəstəyi lazımdır. - Yaddaş cache-i — sessiya boyu, ən sürətli.
- DB cache (Room) — offline-first-ün onurğası: DB single source of truth, şəbəkə DB-ni yeniləyir.
İnvalidasiya ən çətin hissədir: TTL (vaxt əsaslı), event əsaslı (istifadəçi köçürmə etdi → balans cache-i köhnəldi), versiya əsaslı (ETag/If-None-Match → 304).
class TransactionRepository @Inject constructor(
private val api: TransactionApi,
private val dao: TransactionDao
) {
// UI həmişə DB-yə baxır — offline-da da işləyir
fun observeTransactions(accountId: String): Flow<List<Transaction>> =
dao.observeByAccount(accountId).map { list -> list.map { it.toDomain() } }
// Yeniləmə DB-ni yazır; Flow avtomatik yeni datanı ötürür
suspend fun refresh(accountId: String): RefreshResult = try {
val remote = api.getTransactions(accountId)
dao.upsertAll(remote.map { it.toEntity() })
RefreshResult.Success
} catch (e: IOException) {
RefreshResult.Offline // UI: "son yenilənmə 14:32" göstərir
}
}Offline-first repository: DB oxu, şəbəkə yenilə
Bank tətbiqində sərhədlər: balans və tranzaksiya tarixçəsi cache-lənir (köhnəlik göstəricisi ilə), amma ödəniş əməliyyatı heç vaxt cache-dən "uğurlu" göstərilmir və offline növbəyə avtomatik qoyulmur — istifadəçi təsdiqi olmadan təkrar icra double-charge riskidir. Sensitive cavablar üçün Cache-Control: no-store server tərəfdən gəlməlidir; gəlmirsə, interceptor-lə məcbur et.
🛠 Tapşırıq
Əvvəlki iki tapşırığı birləşdir: Retrofit + Room ilə offline-first repository yaz.
observeX()yalnız DB-dən oxusun,refresh()şəbəkədən çəkib DB-yə yazsın.- Uçuş rejimini aç, tətbiqi yenidən başlat — məlumat hələ də görünməlidir.
- UI-a "son yenilənmə HH:mm" göstəricisi əlavə et və 5 dəqiqədən köhnə olanda xəbərdarlıq göstər.
Bitdi sayılır: internet yoxkən ekran boş qalmırsa və istifadəçi datanın köhnə olduğunu görürsə.
📚 Mənbələr və sənədlər
- Data layer — offline-firstrəsmideveloper.android.com
- OkHttp cacherəsmilysine.dev