Önbelleğe Alma ve Performans
Bellek ve disk önbelleğe almanın temelleri.
Önbelleğe Alma ve Performans, CoddyKit'te ücretsiz bir Android Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Android Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Android Academy kursu toplamda 4 dersten oluşur.
Önbelleğe Alma Neden Önemlidir
Bir görseli indirmek ve kodunu çözmek maliyetlidir: bant genişliği, pil ve CPU kullanır. Bir liste her kaydırıldığında aynı görseli yeniden getirirseniz uygulamanız yavaş hissedilir ve veri tüketimi artar.
Önbelleğe alma, bir sonraki isteğin neredeyse anında tamamlanması için kodu çözülmüş görselleri ve indirilen baytları saklar. Coil varsayılan olarak iki önbellekle gelir: bellek içi önbellek (hızlı, kodu çözülmüş bit eşlemler) ve disk önbelleği (kalıcı, ham baytlar).
Bu derste bunların nasıl çalıştığını ve nasıl ayarlanacağını açıklayacağız.
İki Katman: Bellek ve Disk
Coil, önbellekleri şu sırayla kontrol eder:
- Bellek önbelleği: yakın zamanda kullanılan, kodu çözülmüş bit eşlemleri RAM'de tutar. Buradaki isabet anlıktır; kod çözme gerekmez.
- Disk önbelleği: indirilen özgün baytları cihazda saklar. Buradaki isabet ağ erişimini atlar, ancak yine de kod çözme gerekir.
- Ağ: yalnızca her iki önbellekte de isabet olmadığında kullanılan yavaş yoldur.
Bellek hızlıdır ancak küçüktür ve uygulama kapandığında temizlenir; disk daha büyüktür ve yeniden başlatmalardan sonra da korunur.
ImageLoader'ı Yapılandırma
Önbellekler her isteğin arkasındaki motor olan ImageLoader üzerinde bulunur. Genellikle bir özel yükleyici oluşturur ve bunu yeniden kullanırsınız. Burada bellek önbelleğinin boyutunu kullanılabilir RAM'in yüzdesine, disk önbelleğini ise sabit bir bayt bütçesine göre ayarlıyoruz.
Tekil bir yükleyici, yinelenen önbellekleri ve boşa harcanan belleği önler.
import android.content.Context
import coil3.ImageLoader
import coil3.disk.DiskCache
import coil3.memory.MemoryCache
import okio.Path.Companion.toOkioPath
fun newImageLoader(context: Context): ImageLoader =
ImageLoader.Builder(context)
.memoryCache {
MemoryCache.Builder()
.maxSizePercent(context, 0.25) // 25% of app RAM
.build()
}
.diskCache {
DiskCache.Builder()
.directory(context.cacheDir.resolve("image_cache").toOkioPath())
.maxSizeBytes(50L * 1024 * 1024) // 50 MB
.build()
}
.build()Tekil Yükleyici Sağlama
Coil 3, Application sınıfınızda SingletonImageLoader.Factory uygulayarak uygulama genelinde tek bir yükleyici ayarlamanıza olanak tanır. Böylece her AsyncImage bunu otomatik olarak kullanır; her seferinde bir yükleyici geçirmeniz gerekmez.
import android.app.Application
import coil3.ImageLoader
import coil3.PlatformContext
import coil3.SingletonImageLoader
class MyApp : Application(), SingletonImageLoader.Factory {
override fun newImageLoader(context: PlatformContext): ImageLoader =
ImageLoader.Builder(context)
.crossfade(true)
.build()
}Önbellek İlkelerini Denetleme
Her istek, memoryCachePolicy ve diskCachePolicy ile önbelleğe almayı etkinleştirebilir veya devre dışı bırakabilir. İlkeler ENABLED, READ_ONLY, WRITE_ONLY veya DISABLED olabilir.
Örneğin, RAM'de tutmak istemediğiniz, tek seferlik büyük görseller için bellek önbelleğini veya hassas içerikler için disk önbelleğini devre dışı bırakabilirsiniz.
import android.content.Context
import coil3.request.CachePolicy
import coil3.request.ImageRequest
fun noMemoryCacheRequest(context: Context, url: String) =
ImageRequest.Builder(context)
.data(url)
.memoryCachePolicy(CachePolicy.DISABLED)
.diskCachePolicy(CachePolicy.ENABLED)
.build()Yeniden Boyutlandırma: Büyük Bit Eşlemleri Kodlamayın
En büyük performans hatası, 4000x3000 boyutundaki bir fotoğrafın kodunu 100dp boyutunda bir küçük görsele çözmektir. Bu, bellek ve zaman israfına yol açar. Coil, varsayılan olarak bit eşlemi birleştirilebilir bileşenin ölçülen sınırlarına göre boyutlandırır; bu nedenle küçük bir AsyncImage küçük bir bit eşlemin kodunu çözer.
Boyutları bildiğinizde, istek üzerinde size() kullanarak açık bir hedef boyutu zorunlu kılabilirsiniz.
import android.content.Context
import coil3.request.ImageRequest
import coil3.size.Size
fun thumbnailRequest(context: Context, url: String) =
ImageRequest.Builder(context)
.data(url)
.size(Size(200, 200)) // decode at most 200x200
.build()Kararlı Önbellek Anahtarları
Coil, önbellek anahtarını istek verilerinden türetir. URL'leriniz değişen sorgu parametreleri (imzalı bir belirteç gibi) içeriyorsa aynı görseller farklı anahtarlar alır ve önbellekte hiçbir zaman bulunamaz.
Önbelleğe almanın çalışması için kararlı kısma (örneğin görsel kimliğine) dayalı açık bir memoryCacheKey ve diskCacheKey ayarlayın.
import android.content.Context
import coil3.request.ImageRequest
fun stableKeyRequest(context: Context, id: String, signedUrl: String) =
ImageRequest.Builder(context)
.data(signedUrl)
.memoryCacheKey("image_$id")
.diskCacheKey("image_$id")
.build()Görselleri Önceden Yükleme
Daha akıcı bir deneyim için görsel gösterilmeden önce önbelleği ısıtabilirsiniz; örneğin bir akışın sonraki sayfasını önceden getirebilirsiniz. Hedefi olmayan bir istekle yükleyicinin enqueue işlevini kullanın.
Kullanıcı görsele ulaştığında görsel zaten önbelleğe alınmış olur ve anında görünür.
import android.content.Context
import coil3.ImageLoader
import coil3.request.ImageRequest
fun preload(context: Context, loader: ImageLoader, urls: List<String>) {
urls.forEach { url ->
val request = ImageRequest.Builder(context)
.data(url)
.build()
loader.enqueue(request)
}
}Önbelleği Temizleme
Bazen yer açmanız veya yenilemeyi zorlamanız gerekir; örneğin kullanıcı avatarını güncelledikten sonra. Bellek önbelleğini, disk önbelleğini temizleyebilir veya tek bir anahtarı kaldırabilirsiniz.
Her şeyi temizlemek ağır bir işlemdir; mümkün olduğunda belirli anahtarları kaldırmayı tercih edin.
import coil3.ImageLoader
import coil3.memory.MemoryCache
fun refreshAvatar(loader: ImageLoader, key: String) {
// Remove one entry so the next load refetches
loader.memoryCache?.remove(MemoryCache.Key(key))
loader.diskCache?.remove(key)
}
fun clearAll(loader: ImageLoader) {
loader.memoryCache?.clear()
// Disk clearing is heavier; do it sparingly
}Crossfade ve Önbellek İsabetleri
Crossfade ağ üzerinden yüklemelerde harika görünür, ancak bir görsel bellek önbelleğinden doğrudan geldiğinde ve anında gösterilebilecekken yavaş hissettirebilir. Coil bu durumu akıllıca ele alır: varsayılan olarak bellek önbelleği isabetlerinde crossfade animasyonunu atlar ve yalnızca gerçekten yüklenen görselleri canlandırır.
Böylece ilk yüklemede yumuşak geçişler, önbellekten yüklenen kaydırma içeriklerinde ise anında gösterim elde edersiniz; ek bir işlem gerekmez.
import android.content.Context
import coil3.request.ImageRequest
import coil3.request.crossfade
fun feedRequest(context: Context, url: String) =
ImageRequest.Builder(context)
.data(url)
// Crossfade plays on real loads; memory-cache hits show instantly
.crossfade(true)
.build()Listeler için Performans Kontrol Listesi
Bir LazyColumn veya ızgarada çok sayıda görsel gösterirken akıcı kaydırma için şu kurallara uyun:
- Coil'in küçük bir bit eşlemin kodunu çözmesi için her görsele sabit bir boyut verin.
- Önbelleklerin paylaşılması için tek bir tekil
ImageLoaderyeniden kullanın. - Düzen kaymalarını önlemek için
ContentScale.Cropkullanın. - Yeniden yüklemeler arasında önbellek anahtarlarını kararlı tutun.
- Ekran dışındaki istekleri Coil'in otomatik olarak iptal etmesine izin verin; buna müdahale etmeyin.
import androidx.compose.foundation.lazy.grid.GridCells
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
import androidx.compose.foundation.lazy.grid.items
import androidx.compose.foundation.layout.aspectRatio
import androidx.compose.ui.Modifier
import androidx.compose.ui.layout.ContentScale
import coil3.compose.AsyncImage
@Composable
fun PhotoGrid(urls: List<String>) {
LazyVerticalGrid(columns = GridCells.Fixed(3)) {
items(urls) { url ->
AsyncImage(
model = url,
contentDescription = null,
contentScale = ContentScale.Crop,
modifier = Modifier.aspectRatio(1f)
)
}
}
}Hızlı Kontrol
Coil, ağa erişmeden önce önbelleklerini kontrol eder. İsabet olduğunda kod çözme işlemini tamamen atladığı için en hızlı olan önbellek hangisidir?
Özet
Coil'in görselleri nasıl hızlı tuttuğunu öğrendiniz:
- İki önbellek vardır: bellek (kodu çözülmüş, hızlı, küçük) ve disk (ham baytlar, kalıcı, daha büyük).
- Boyutları özel bir
ImageLoaderüzerinde yapılandırın veSingletonImageLoader.Factoryaracılığıyla bir tane sunun. - İstek başına davranışı
memoryCachePolicyvediskCachePolicyile ayarlayın. - Her zaman görüntüleme boyutunda kod çözün; gerektiğinde açık bir
size()ayarlayın. - Kararlı önbellek anahtarları kullanın, yaklaşan görselleri önceden yükleyin ve yenilemek için belirli anahtarları temizleyin.
Sırada görsellerin ötesine geçerek ses ve video oynatmak var.
Sıkça Sorulan Sorular
“Önbelleğe Alma ve Performans” dersi ücretsiz mi?
Evet — “Önbelleğe Alma ve Performans” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Android Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Android Academy kursu toplamda 4 dersten oluşur.
“Önbelleğe Alma ve Performans” dersinde ne öğreneceğim?
Bellek ve disk önbelleğe almanın temelleri. Android Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Android Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Android Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“Önbelleğe Alma ve Performans” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Android Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Android Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Coil ile Görüntü Yükleme
- Yer Tutucular ve Hata Durumları
- Önbelleğe Alma ve Performans
- Ses ve Video Oynatma