Optimize edilmemiş indirmelerden kaçınma

Uygulamanızın bazı kullanıcıları internete ara sıra erişebiliyor veya cihazlarına indirebilecekleri bilgi miktarı sınırlı. Uygulamanızın indirilmesi gereken veri miktarını azaltarak kullanıcıları uygulamanızla daha sık etkileşimde bulunmaya teşvik edebilirsiniz.

İndirme sayınızı azaltmanın en temel yolu, yalnızca ihtiyacınız olanları indirmektir. Veriler 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 anlamına gelir.

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

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

Yinelenen verileri indirmekten kaçınmak da önemli bir tekniktir. Ö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 alması 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 önbelleğe mümkün olduğunca agresif bir şekilde eklemeniz önemlidir. Tam boyutlu resimler gibi isteğe bağlı indirmeler de dahil olmak üzere statik kaynakları her zaman makul olduğunca uzun süre boyunca önbelleğe alın. İsteğe bağlı kaynakların ayrı olarak depolanması, isteğe bağlı önbelleğinizin boyutunu yönetmek için düzenli olarak temizlemenize olanak tanır.

Önbelleğe alma işleminin uygulamanızın eski veriler 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. Örnek:

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ına ve başlıklara otomatik olarak uyacak şekilde yapılandırabilirsiniz. Örneğin, OkHttp kullanılırken istemci için bir önbellek dizini ve önbellek boyutu yapılandırıldığında kitaplığın HTTP önbelleğe alma özelliğini kullanması sağlanır. 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 yeniliklerini doğrulayabilir. Böylece, indirmeyle ilişkili bant genişliği maliyeti ortadan kaldırılır. Önbelleğe alınmayan yanıtlar, gelecekteki istekler için yanıt önbelleğine 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ği iç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 depolama alanı tasarım kalıbını kullanabilirsiniz. Bu işlem, belirli bir veri veya kaynak üzerinde API soyutlaması sağlayan, Depo olarak bilinen özel bir sınıf oluşturmayı içerir. Depo, başlangıçta verilerini uzak web hizmeti gibi çeşitli kaynaklardan getirebilir ancak sonraki aramalarda arayanlara verilerin önbelleğe alınmış bir sürümünü sağlar. Bu dolaylı erişim katmanı, uygulamanıza özgü güçlü bir önbelleğe alma stratejisi sunmanıza olanak tanır. Uygulamanızda Depolama modeli kullanma hakkında daha fazla bilgi için Uygulama mimarisi kılavuzu başlıklı makaleyi inceleyin.