Optimize edilmemiş indirmelerden kaçınma

Uygulamanızın bazı kullanıcılarının internete aralıklı erişimi var veya sınırları var indirebileceği bilgi miktarı açısından yararlıdır. Şunları yapabilirsiniz: içerik miktarını azaltarak kullanıcıları uygulamanızla daha sık indirmesi gereken verilerdir.

İndirmelerinizi azaltmanın en temel yolu, yalnızca ihtiyacınız olanları indirmektir. Veri açısından bu, REST API'leri uygulamanız ve aşağıdaki gibi parametreler kullanarak döndürülen verileri sınırlayan sorgu ölçütleri belirtin: ve son güncellemenizin zamanı.

Benzer bir şekilde, resimleri indirirken küçültülmüş tam boyutlu resimler indirmek yerine sunucu tarafındaki resimler gerekir.

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ın tekrar tekrar indirilmesi olasılığını azaltabilirsiniz. Uygulamanızın veri ve kaynaklarını önbelleğe alarak bu bilgiler arasında yer alır. Uygulamanızın kısa bir süre içinde bir defadan fazla aynı bilgiyi önbelleğe bir kez indirir.

İ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. Aşağıdakiler dahil olmak üzere statik kaynakları her zaman önbelleğe al tam boyutlu resimler gibi isteğe bağlı indirmeler (belirli bir süre boyunca yapmasını sağlar. Aşağıdaki işlemleri yapabilmeniz için isteğe bağlı kaynakların ayrı olarak depolanması gerekir: İsteğe bağlı önbelleğinizi, boyutunu yönetmek için düzenli olarak temizleyin.

Önbelleğe alma işleminizin eski veriler göstermesine neden olmaması için uygun HTTP durum kodlarını ve üstbilgiler, örneğin ETag ve Last-Modified konu başlıklarına bakabilir. Bu sayede, ilişkilendirilen içeriğin ne zaman kullanılması gerektiğini yenilendi. Ö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. Bunu kullanırken OkHttp, örneğin, bir önbellek dizini ve önbellek boyutu belirlemek, kitaplığın Aşağıdaki kod örneğinde gösterildiği gibi HTTP önbelleğine alma:

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ınmış yanıtlar, sunucudaki güncelliğini doğrulayabilir. Böylece indirmeyle ilişkili bant genişliği maliyeti de ortadan kalkar. Önbelleğe alınmamış yanıtlar ileride gönderilecek 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, aşağıdaki adımları uygulayarak yönetilen, güvenli uygulama önbelleğindeki verileri önbelleğe alabilirsiniz: kullanarak Context.getCacheDir(). Sistemde kullanılabilir depolama alanı azaldığında bu dahili önbelleğin temizlenebileceğini unutmayın.

Depo kullanma

Önbelleğe almaya daha gelişmiş bir yaklaşım için Depo tasarımını kullanmayı düşünün desen. 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 alanı kalıbını kullanma hakkında daha fazla bilgi için Uygulama mimarisi kılavuzu başlıklı makaleyi inceleyin.