🍪Android’de Önbelleğe Alma İşlemi(Caching)

Ali Osman ARSLAN
Huawei Developers - Türkiye
3 min readDec 29, 2023
Android Önbellek

Giriş

Android uygulama performansını ve veri alışverişini optimize etmek, günümüz geliştiricileri için önemli bir önceliktir. Bu bağlamda, önbelleğe alma (caching) teknikleri, özellikle ağ istekleri ve veri çekme süreçlerinde, uygulama verimliliğini artırmak için vazgeçilmez bir araçtır. Bu makalede, Kotlin programlama dilini kullanarak Android uygulamasında önbelleğe alma işlemlerini adım adım anlatacağız. Özellikle API isteklerinden gelen verileri önbelleğe alma odak noktamız olacak. Şimdi, bu süreci daha yakından inceleyelim.

👨‍💻Başlayalım

  1. Bağımlılıkları Ekleyin

Bu adımda, Retrofit ve OkHttp kütüphanelerini ağ işlemleri için, Room kütüphanesini de yerel veritabanı işlemleri için ekliyoruz.

implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.okhttp3:okhttp:4.9.0'
implementation 'androidx.room:room-runtime:2.2.5'
kapt 'androidx.room:room-compiler:2.2.5'

2.Retrofit ve Room Initialization

Bu adımda, Retrofit ve OkHttp’yi kullanarak ağ işlemleri için bir istemci oluşturuyoruz. Ayrıca, Room için kullanılacak olan veritabanı önbelleği de belirleniyor.

val cacheSize = (10 * 1024 * 1024).toLong() // 10 MB
val cache = Cache(context.cacheDir, cacheSize)
val okHttpClient = OkHttpClient.Builder()
.cache(cache)
.build()

val retrofit = Retrofit.Builder()
.baseUrl("https://api.example.com/")
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.build()

3.Room Entity

Bu adımda, Room veritabanında saklanacak olan verinin modelini belirleyen bir Entity sınıfı oluşturuyoruz. Burada url alanı benzersiz bir anahtar olarak kullanılıyor.

@Entity(tableName = "data_cache")
data class DataCache(
@PrimaryKey val url: String,
val json: String,
val timestamp: Long
)

4.Room DAO

Bu adımda, Room için Data Access Object (DAO) tanımlıyoruz. DAO, veritabanına erişim işlemlerini içerir. insertCache ile veri ekleniyor ve getCache ile belirli bir URL için veriyi sorguluyoruz.

@Dao
interface DataCacheDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertCache(dataCache: DataCache)

@Query("SELECT * FROM data_cache WHERE url = :url")
suspend fun getCache(url: String): DataCache?
}

5. Room Database

Bu adımda, Room veritabanını temsil eden bir abstract sınıf tanımlıyoruz ve içinde kullanılacak DAO’yu belirtiyoruz.

@Database(entities = [DataCache::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun dataCacheDao(): DataCacheDao
}

6. Room Database Instantiate

Bu adımda, Room veritabanını oluşturuyoruz.

val db = Room.databaseBuilder(
applicationContext,
AppDatabase::class.java, "cache-database"
).build()

7.Cache Expiry Time Belirlenmesi

Bu adımda, önbelleğin geçerliliğini belirlemek için bir zaman tanımlıyoruz.

const val CACHE_VALIDITY = 5 * 60 * 1000 // Önbellek geçerlilik süresi, örneğin, 5 dakika

8.Fetch Data with Caching Logic

Bu adımda, veriyi önbellekten almaya çalışan bir fonksiyon oluşturuyoruz. Eğer veri önbellekte mevcut ve hala geçerliyse, hemen geri döner. Aksi takdirde, ağdan veri çekilir ve hem önbelleğe hem de Room veritabanına kaydedilir. Eğer bir hata oluşursa, boş bir string döner.

suspend fun fetchData(url: String): String {
val cachedData = db.dataCacheDao().getCache(url)
if (cachedData != null && System.currentTimeMillis() - cachedData.timestamp < CACHE_VALIDITY) {
return cachedData.json // Eğer hala geçerliyse önbelleğe alınmış veriyi döndür
} else {
try {
val responseBody = retrofit.create(YourApiService::class.java).getData(url).body()
if (responseBody != null) {
db.dataCacheDao().insertCache(DataCache(url, responseBody, System.currentTimeMillis()))
}
return responseBody ?: ""
} catch (e: Exception) {
e.printStackTrace()
return ""
}
}
}

Sonuç

Android uygulamalarında önbelleğe alma, performansı ve veri yönetimini optimize etme konusunda kritik bir rol oynar. Bu makalede, Kotlin programlama dilini kullanarak önbellek yönetimini detaylı bir şekilde ele aldık. İn-memory caching, disk caching ve network caching gibi farklı türlerde önbellekleme stratejilerini anladık. Ayrıca, Retrofit ve Room gibi güçlü kütüphaneleri kullanarak API yanıtlarını önbelleğe almayı adım adım öğrendik.

Önbellekleme stratejilerini doğru bir şekilde uygulamak, kullanıcı deneyimini iyileştirmenin yanı sıra veri alışverişini daha verimli hale getirir. Ancak, bu stratejilerin kullanımında dikkat edilmesi gereken bazı best practices ve önemli hususlar bulunmaktadır.

Unutulmamalıdır ki, uygulama gereksinimlerine bağlı olarak önbellekleme stratejileri ayarlanmalı ve sürekli olarak izlenmelidir. Bu sayede, uygulama hem hızlı hem de güvenilir bir şekilde çalışmaya devam eder.

Referanslar

--

--