Optimize edilmemiş indirmelerden kaçınma

Uygulamanızın kullanıcılarının bazılarının internete aralıklı erişimi var veya cihazlarına indirebilecekleri bilgi miktarında sınırlamalar var. Uygulamanızın indirmesi gereken veri miktarını azaltarak kullanıcıları uygulamanızla daha sık etkileşimde bulunmaya teşvik edebilirsiniz.

İndirme sayısını azaltmanın en temel yolu yalnızca ihtiyacınız olanları indirmektir. Veri açısından bu, son güncellemenizin zamanı gibi parametreleri kullanarak döndürülen verileri sınırlandıran sorgu ölçütleri belirtmenize olanak tanıyan REST API'lerin uygulanması anlamına gelir.

Benzer şekilde, görüntüleri indirirken, istemcide boyutu küçülen tam boyutlu resimleri indirmek yerine sunucu tarafındaki resimlerin boyutunu küçültmek iyi bir uygulamadır.

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

Diğer bir önemli teknik de yinelenen verileri indirmemektir. Önbelleğe almayı 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ı bilgi parçasına birden çok kez erişmesi gerekiyorsa bunu önbelleğe yalnızca bir kez indirmeniz yeterlidir.

İndirdiğiniz toplam veri miktarını azaltmak için önbelleğe alınma işlemini mümkün olduğunca yoğun yapmak önemlidir. Tam boyutlu resimler gibi isteğe bağlı indirmeler dahil olmak üzere statik kaynakları her zaman makul bir süre boyunca önbelleğe alın. İsteğe bağlı kaynaklar, boyutunu yönetmek üzere isteğe bağlı önbelleğinizi düzenli olarak boşaltabilmenizi sağlamak için ayrı olarak depolanmalıdır.

Önbelleğe alma işleminizin, uygulamanızın eski veriler göstermesine neden olmaması için ETag ve Last-Modified başlıkları gibi uygun HTTP durum kodlarını ve üst bilgilerini 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ğ iletişimi kitaplıklarını, bu durum kodlarına ve üstbilgilerine otomatik olarak uyacak şekilde yapılandırabilirsiniz. Örneğin, OkHttp kullanırken, istemci için bir önbellek dizini ve önbellek boyutu yapılandırmak, aşağıdaki kod örneğinde gösterildiği gibi kitaplığın HTTP önbelleğe alma özelliğini 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 sunabilir, böylece ağ bağlantısı açma ihtiyacını ortadan kaldırabilirsiniz. Koşullu olarak önbelleğe alınan yanıtlar, bunların sunucudaki güncelliğini doğrulayarak indirme işlemiyle 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.

Yönetilmeyen harici önbellek dizinindeki hassas olmayan verileri, Context.getExternalCacheDir() kullanarak önbelleğe alabilirsiniz. Alternatif olarak, Context.getCacheDir() kullanarak yönetilen ve güvenli uygulama önbelleğindeki verileri önbelleğe alabilirsiniz. Sistemde kullanılabilir depolama alanı azaldığında bu dahili önbelleğin boşaltılabileceğini unutmayın.

Depo kullanma

Önbelleğe almayla ilgili daha sofistike bir yaklaşım için Depo tasarım modelini değerlendirin. Bu, belirli veriler veya kaynaklar üzerinde API özeti sağlayan bir Repository olarak bilinen özel bir sınıf oluşturmayı içerir. Depo, ilk olarak verilerini uzak bir web hizmeti gibi çeşitli kaynaklardan alabilir ancak sonraki çağrılarda arayanlara verilerin önbelleğe alınmış bir sürümünü sunar. Bu yönlendirme katmanı, uygulamanıza özel sağlam bir önbelleğe alma stratejisi sağlamanıza olanak tanır. Kod deposu kalıbını uygulamanızda kullanma hakkında daha fazla bilgi için Uygulama mimarisi rehberine bakın.