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 konusunda hemfikir olmasını sağlamaktır. Şunları yapabilirsiniz: içerik miktarını azaltarak kullanıcıları uygulamanızla daha sık indirmesi gereken verilerdir.

İndirme sayınızı azaltmanın en temel yolu, yalnızca indirdiğiniz içerikleri indirmektir. gerekiyor. 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 al

Diğer bir önemli teknik de yinelenen verileri indirmekten kaçınmaktır. Şunları yapabilirsiniz: aynı veri parçasını birden fazla kez indirme olasılığını azaltmak için önbelleğe alma. 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.

Toplam veri miktarını azaltmak için, önbelleğe alma işlemini mümkün olduğunca agresif bir şekilde yapmak önemlidir. indirdiğiniz veri miktarıdır. 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 başlıklar. 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ğ iletişimi kitaplıklarını bu durum kodlarına ve başlıklarına otomatik olarak erişebilir. 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 sunabilirsiniz Bu da ağ bağlantısı açma ihtiyacını ortadan kaldırır. 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.

Yönetilmeyen harici önbellek dizinindeki hassas olmayan verileri aşağıdaki şekilde önbelleğe alabilirsiniz: kullanarak Context.getExternalCacheDir(). Alternatif olarak, aşağıdaki adımları uygulayarak yönetilen, güvenli uygulama önbelleğindeki verileri önbelleğe alabilirsiniz: kullanarak Context.getCacheDir(). Bu dahili önbelleğin, sistem gücü azaldığında temizlenebileceğini unutmayın. kullanabilirsiniz.

Depo kullanma

Önbelleğe almaya daha gelişmiş bir yaklaşım için Depo tasarımını kullanmayı düşünün desen. Bunun için Repository olarak bilinen özel bir sınıf oluşturup Belirli bir veri veya kaynak üzerinde API soyutlaması sağlar. Depo başlangıçta uzak web hizmeti gibi çeşitli kaynaklardan verileri getirebilir. ancak arayanlara sonraki aramalarda verilerin önbelleğe alınmış bir sürümünü sunar. Bu Dolaylılık katmanı, hem ve en iyi uygulamaları paylaşacağız. Depo kalıbını kullanma hakkında daha fazla bilgi için görmek için Uygulama rehberini mimari.