Optimize edilmemiş indirmelerden kaçınma

Uygulamanızın bazı kullanıcıları internete kesintili olarak erişiyor veya cihazlarına indirebilecekleri bilgi miktarı sınırlı. Uygulamanızın indirmesi gereken veri miktarını azaltarak kullanıcıları uygulamanızla daha sık etkileşim kurmaya teşvik edebilirsiniz.

İndirme işlemlerinizi azaltmanın en temel yolu, yalnızca ihtiyacınız olan dosyaları indirmektir. Veri açısından bu, son güncellemenizin zamanı gibi parametreleri kullanarak döndürülen verileri sınırlayan sorgu ölçütlerini belirtmenize olanak tanıyan REST API'leri uygulamanız gerektiği anlamına gelir.

Benzer şekilde, resim indirirken istemcide küçültülen tam boyutlu resimleri indirmek yerine resimlerin boyutunu sunucu tarafında küçültmek iyi bir uygulamadır.

HTTP yanıtlarını önbelleğe alma

Diğer bir önemli teknik de yinelenen verileri indirmekten kaçınmaktır. Önbelleğe alma özelliğini kullanarak aynı veri parçasını tekrar tekrar indirme olasılığını azaltabilirsiniz. Uygulamanızın verilerini ve kaynaklarını önbelleğe alarak uygulamanızın referans vermesi gereken bilgilerin yerel bir kopyasını oluşturursunuz. Uygulamanızın kısa bir süre içinde aynı bilgiye birden çok kez erişmesi gerekiyorsa bu bilgiyi önbelleğe yalnızca bir kez indirmeniz gerekir.

İndirdiğiniz toplam veri miktarını azaltmak için mümkün olduğunca agresif bir şekilde önbelleğe alma işlemi yapmanız önemlidir. Tam boyutlu resimler gibi isteğe bağlı indirmeler de dahil olmak üzere statik kaynakları her zaman mümkün olduğunca uzun süre önbelleğe alın. Seç-izle kaynakları, boyutunu yönetmek için seç-izle önbelleğinizi düzenli olarak temizlemenize olanak tanıyacak şekilde ayrı olarak depolanmalıdır.

Önbelleğe alma işleminin, uygulamanızın eski verileri göstermesine neden olmaması için ETag ve Last-Modified üstbilgileri gibi uygun HTTP durum kodlarını ve üstbilgilerini kullanın. Bu sayede, ilişkili içeriğin ne zaman yenilenmesi gerektiğini belirleyebilirsiniz. Örneğin:

Kotlin

// url represents the website containing the content to place into the cache.
val conn: HttpsURLConnection = url.openConnection() as HttpsURLConnection
val currentTime: Long = System.currentTimeMillis()
val lastModified: Long = conn.getHeaderFieldDate("Last-Modified", currentTime)

// lastUpdateTime represents when the cache was last updated.
if (lastModified < lastUpdateTime) {
    // Skip update
} else {
    // Parse update
    lastUpdateTime = lastModified
}

Java

// url represents the website containing the content to place into the cache.
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
long currentTime = System.currentTimeMillis();
long lastModified = conn.getHeaderFieldDate("Last-Modified", currentTime);

// lastUpdateTime represents when the cache was last updated.
if (lastModified < lastUpdateTime) {
    // Skip update
} else {
    // Parse update
    lastUpdateTime = lastModified;
}

Bazı ağ kitaplıklarını bu durum kodlarını ve üstbilgileri otomatik olarak dikkate alacak şekilde yapılandırabilirsiniz. Örneğin, OkHttp kullanırken istemci için bir önbellek dizini ve önbellek boyutu yapılandırmak, kitaplığın HTTP önbelleğe alma özelliğini kullanmasını sağlar. Bu durum aşağıdaki kod örneğinde gösterilmiştir:

Kotlin

val cacheDir = Context.getCacheDir()
val cacheSize = 10L * 1024L * 1024L // 10 MiB
val client: OkHttpClient = OkHttpClient.Builder()
    .cache(Cache(cacheDir, cacheSize))
    .build()

Java

File cacheDir = Context.getCacheDir();
long cacheSize = 10L * 1024L * 1024L; // 10 MiB
OkHttpClient client = new OkHttpClient.Builder()
    .cache(new Cache(cacheDir, cacheSize))
    .build();

Önbellek yapılandırıldığında, tamamen önbelleğe alınmış HTTP isteklerini doğrudan yerel depolama alanından sunarak ağ bağlantısı açma ihtiyacını ortadan kaldırabilirsiniz. Koşullu olarak önbelleğe alınan yanıtlar, sunucudan güncelliğini doğrulayabilir ve indirmeyle ilişkili bant genişliği maliyetini ortadan kaldırabilir. Önbelleğe alınmamış yanıtlar, gelecekteki istekler için yanıt önbelleğinde depolanır.

Context.getExternalCacheDir() kullanarak hassas olmayan verileri yönetilmeyen harici önbellek dizininde önbelleğe alabilirsiniz. Alternatif olarak, Context.getCacheDir() kullanarak verileri yönetilen, güvenli uygulama önbelleğinde önbelleğe alabilirsiniz. Sistemde kullanılabilir depolama alanı azaldığında bu dahili önbelleğin temizlenebileceğini unutmayın.

Depo kullanma

Önbelleğe alma konusunda daha gelişmiş bir yaklaşım için depo tasarım kalıbını kullanabilirsiniz. Bu işlem, belirli bir veri veya kaynak üzerinde API soyutlaması sağlayan ve depo olarak bilinen özel bir sınıf oluşturmayı içerir. Depo, verilerini başlangıçta uzak bir web hizmeti gibi çeşitli kaynaklardan getirebilir ancak sonraki çağrılarda, çağrı yapanlara verilerin önbelleğe alınmış bir sürümünü sağlar. Bu dolaylılık katmanı, uygulamanıza özel sağlam bir önbelleğe alma stratejisi sunmanıza olanak tanır. Uygulamanızda depo tasarımını kullanma hakkında daha fazla bilgi için Uygulama mimarisi kılavuzuna bakın.