Men quradigan ilovalarning koʻpi aloqa ishonchsiz joylarda ishlatiladi. Bu arxitekturani boshqa har qanday talabdan koʻproq oʻzgartiradi: telefon haqiqat manbasi boʻlishi kerak, server esa soʻraladigan joy emas, sinxronlanadigan joyga aylanadi.
Avval lokal maʼlumot
Har bir ekran faqat lokal bazadan oʻqiydi. Tarmoq qatlami interfeysni hech qachon toʻgʻridan-toʻgʻri chizmaydi; u interfeys kuzatadigan xuddi shu jadvallarga yozadi. Bu ravshan koʻrinadi — “bitta jonli qiymat kerak” degan ekranga duch kelmaguningizcha. Oflayn qoʻllab-quvvatlash koʻpincha aynan shu bitta ekranda buziladi.
Yordam beradigan kichik qoida: repozitoriy Flow obyektlari qaytaradi, maʼlumot olib
keladigan suspend funksiya emas. Olib kelish — sinxronizatsiya ishchisining vazifasi.
Sinxronizatsiya — fon vazifasi
Sinxronizatsiya tarmoq sharti bilan CoroutineWorker ichida ishlaydi. Avval
yuborib, keyin olish lokal oʻzgarishni eski server maʼlumoti bilan yozib
yuborishdan saqlaydi.
class SyncWorker(ctx: Context, params: WorkerParameters)
: CoroutineWorker(ctx, params) {
override suspend fun doWork(): Result {
// Avval lokal oʻzgarishlar, keyin olish.
return try { repo.push(); repo.pull(); Result.success() }
catch (e: IOException) { Result.retry() }
}
}
Ziddiyatlar bilan ishlash
- Oddiy maydonlar uchun oxirgi yozuv ustun, qurilma vaqt belgisi bilan.
- Roʻyxatlar uchun birlashtirish — ikki kishi qoʻshgan yozuv oʻchib ketmasin.
- Ikki qoida ham toʻgʻri kelmasa, koʻrinadigan “tekshirish kerak” holati.
Maqsad ziddiyatni imkonsiz qilish emas — uni koʻrinadigan va tuzatish arzon qilish.
Yomon tarmoqlarda sinash
Samolyot rejimi — sinov emas. Sekinlashtirilgan, uzilib-uzilib turadigan va kechikishi katta aloqalar har xil narsani buzadi; emulyator profillari birinchi ikkitasini, proksi esa uchinchisini qoplaydi.
Nimani boshqacha qilardim
Ziddiyat qoidalaridan boshlardim. Ular maʼlumot modelini shakllantiradi, keyin qoʻshish esa har bir jadvalni koʻchirishni talab qiladi.