Uygulamanızın bazı kullanıcıları internete aralıklı olarak erişiyor veya cihazlarına indirebilecekleri bilgi miktarıyla ilgili sınırlamaları var. Uygulamanızın indirmesi gereken veri miktarını azaltarak kullanıcıları uygulamanızla daha sık etkileşim kurmaya teşvik edebilirsiniz.
İndirme sayınızı azaltmanın en temel yolu, yalnızca ihtiyacınız olanları indirmektir. Veri açısından bu, döndürülen verileri sınırlayan sorgu ölçütlerini (ör. son güncellemenizin zamanı gibi parametreler kullanarak) belirtmenize olanak tanıyan REST API'lerini uygulamanız gerektiği anlamına gelir.
Benzer şekilde, resimleri indirirken istemcide küçültülmüş tam boyutlu resimleri indirmek yerine sunucu tarafında resimlerin boyutunu küçültmek iyi bir uygulamadır.
HTTP yanıtlarını önbelleğe alma
Bir diğer önemli teknik ise yinelenen verileri indirmekten kaçınmaktır. Önbelleğe alma özelliğini kullanarak aynı veri parçasının tekrar tekrar indirilme 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 süre içinde aynı bilgiye birden çok kez erişmesi gerekiyorsa bu bilgiyi yalnızca bir kez önbelleğe 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 makul ölçüde mümkün olduğu sürece önbelleğe alın. İsteğe bağlı kaynaklar, boyutunu yönetmek için düzenli olarak isteğe bağlı önbelleğinizi temizlemenize olanak tanımak üzere ayrı olarak depolanmalıdır.
Önbelleğe alma işleminizin, uygulamanızın eski veriler göstermesine neden olmaması için HTTP durum kodlarını ve üstbilgilerini (ör. ETag
ve Last-Modified
üstbilgileri) uygun şekilde 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ı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ırmak, kitaplığın aşağıdaki kod örneğinde gösterildiği gibi HTTP önbelleğe almayı kullanmasını sağlar:
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 sunabilirsiniz. Böylece ağ bağlantısı açmanıza gerek kalmaz. Koşullu olarak önbelleğe alınan yanıtlar, sunucudan yeniliklerini doğrulayabilir ve böylece 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 ve güvenli uygulama önbelleğinde önbelleğe alabilirsiniz.
Bu dahili önbelleğin, sistemde kullanılabilir depolama alanı azaldığında temizlenebileceğini unutmayın.
Depo kullanma
Önbelleğe alma konusunda daha gelişmiş bir yaklaşım için Repository tasarım kalıbını kullanabilirsiniz. Bu işlem, belirli veriler veya kaynaklar üzerinde API soyutlaması sağlayan Repository adlı ö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 aramalarda arayanlara 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 sağlamanıza olanak tanır. Uygulamanızda depo kalıbını kullanma hakkında daha fazla bilgi için Uygulama mimarisi kılavuzuna bakın.