Optimize edilmemiş indirmelerden kaçınma

Uygulamanızın bazı kullanıcılarının internete aralıklı olarak erişimi var veya cihazlarına indirebilecekleri bilgi miktarı konusunda sınırlamalar var. 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. Veri açısından bu, son güncellemenizin zamanı gibi parametreleri kullanarak döndürülen verileri sınırlayan sorgu ölçütleri belirtmenize olanak tanıyan REST API'leri uygulamak anlamına gelir.

Benzer şekilde, görüntüleri indirirken istemcide küçültülmüş tam boyutlu resimleri indirmek yerine sunucu tarafındaki görüntülerin boyutunu azaltmak iyi bir uygulamadır.

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

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 veri ve kaynaklarını önbelleğe alarak uygulamanızın referans vermesi gereken bilgilerin yerel bir kopyasını oluşturursunuz. Uygulamanızın aynı bilgilere kısa bir süre içinde 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 mümkün olduğu sürece önbelleğe alın. İsteğe bağlı önbelleğin boyutunu yönetmek amacıyla, isteğe bağlı önbelleği düzenli olarak boşaltabilmeniz için bu kaynakların ayrı olarak depolanması gerekir.

Önbelleğe alma işleminizin eski veriler göstermesine neden olmaması için uygun HTTP durum kodlarını (ETag ve Last-Modified başlıkları gibi) kullanın. Bu, ilişkili içeriğin ne zaman yenilenmesi gerektiğini belirlemenize olanak tanır. Ö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ğ iletişimi 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ık, aşağıdaki kod örneğinde gösterildiği gibi HTTP önbelleğe almayı kullanacak şekilde etkinleştirilir:

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şula bağlı olarak önbelleğe alınan yanıtlar, sunucudaki güncelliğini doğrulayabilir. Böylece, indirmeyle ilişkili bant genişliği maliyeti ortadan kalkar. Önbelleğe alınmamış yanıtlar, gelecekteki istekler için yanıt önbelleğinde depolanır.

Context.getExternalCacheDir() kullanarak yönetilmeyen harici önbellek dizinindeki hassas olmayan verileri önbelleğe alabilirsiniz. Alternatif olarak Context.getCacheDir() kullanarak yönetilen, güvenli uygulama önbelleğindeki verileri ö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ı kullanmayı düşünün. Bu işlem, bazı veriler veya kaynaklar üzerinde API soyutlama sağlayan Kod Deposu 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 çağrılarda arayanlara verilerin önbelleğe alınmış bir sürümünü sunar. Bu dolaylı yönlendirme katmanı, uygulamanıza özel güçlü 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ılavuzu'na bakın.