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 olanları indirmektir. Veri açısından bu, son güncelleme zamanınız gibi parametreleri kullanarak döndürülen verileri sınırlayan sorgu ölçütlerini belirtmenize olanak tanıyan REST API'leri uygulamak 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
Önemli bir diğer 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 başvurması 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 seç-izle indirmeler de dahil olmak üzere statik kaynakları her zaman makul bir süre boyunca ö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şleminizin, 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:
// 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 }
Bazı ağ kitaplıklarını bu durum kodlarına ve üstbilgilere otomatik olarak uyacak ş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 almayı kullanmasını sağlar. Bu durum aşağıdaki kod örneğinde gösterilmiştir:
val cacheDir = context.getCacheDir() val cacheSize = 10L * 1024L * 1024L // 10 MiB val client: OkHttpClient = OkHttpClient.Builder() .cache(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ılavuzu'na bakın.