Sobes.tech
Middle+

Uygulama ile çevrimdışı modda çalışma imkanını nasıl sağlardınız?

sobes.tech yapay zeka

AI'dan gelen yanıt

Çevrimdışı modu uygulamak için, yerel veri depolama ve senkronizasyon mekanizmasının bir kombinasyonunu kullanırdım.

  1. Yerel Depolama:

    • Yapılandırılmış ve ilişkisel veriler için: Room Veritabanı (SQLite üzerine bir soyutlama).
    • Anahtar-değer verileri için: SharedPreferences veya Jetpack DataStore.
    • Büyük ikili veriler (görseller, videolar) için: dahili veya harici depolama kullanımı.
    // Room Veritabanı kullanım örneği
    @Entity
    data class User(
        @PrimaryKey val userId: Int,
        val name: String,
        val email: String
    )
    
    @Dao
    interface UserDao {
        @Query("SELECT * FROM user")
        fun getAllUsers(): Flow<List<User>>
    
        @Insert(onConflict = OnConflictStrategy.REPLACE)
        suspend fun insertUsers(users: List<User>)
    }
    
  2. Senkronizasyon Mekanizması:

    • Ağ bağlantı durumunu ConnectivityManager veya NetworkCallback ile izleme.
    • Arka plan senkronizasyon görevleri için WorkManager kullanımı.
    • Senkronizasyon stratejileri:
      • Push: Bağlantı varsa, yerel değişiklikleri sunucuya gönder.
      • Pull: Bağlantı varsa, sunucudan değişiklikleri indir.
      • Two-way: Push ve Pull kombinasyonu, çatışma çözümü ile.
    • Veri birleştirmede çatışma yönetimi (örneğin, Last-Write Wins, Merging).
    // WorkManager kullanarak senkronizasyon örneği
    class SyncWorker(appContext: Context, workerParams: WorkerParameters) : CoroutineWorker(appContext, workerParams) {
        override suspend fun doWork(): Result {
            return try {
                // Senkronizasyon mantığı: sunucudan veri yükleme, Room'a kaydetme
                Result.success()
            } catch (e: Exception) {
                Result.failure()
            }
        }
    }
    
    // Bağlantı sağlandığında senkronizasyon görevini başlatma
    val syncRequest = OneTimeWorkRequestBuilder<SyncWorker>()
        .setConstraints(Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build())
        .build()
    WorkManager.getInstance(context).enqueue(syncRequest)
    
  3. Kullanıcı Arayüzü:

    • Kullanıcıya yerel olarak kaydedilen verilerin gösterilmesi.
    • Ağ durumu ve senkronizasyon sürecinin gösterilmesi.
    • Senkronizasyon hatalarıyla ilgili mesajların gösterilmesi.
    // Room'dan veri almak için ViewModel kullanımı örneği
    class UserViewModel(private val userDao: UserDao) : ViewModel() {
        val users: LiveData<List<User>> = userDao.getAllUsers().asLiveData()
    
        fun syncUsers() {
            // WorkManager veya doğrudan başlatma
        }
    }
    

Offline modunun temel aşamaları:

Ağ Durumu Uygulama Eylemi
Çevrimiçi Güncel verilerin gösterilmesi, gerçek zamanlı yükleme/gönderme
Çevrimdışı Yerel kaydedilen verilerin gösterilmesi, değişikliklerin önbelleğe alınması ve daha sonra gönderilmesi
Bağlantı yeniden kurulduğunda Arka planda senkronizasyonun başlatılması