Nicht optimierte Downloads vermeiden

Einige Nutzer deiner App haben nur zeitweise Zugriff auf das Internet oder sind beschränkt wie viele Informationen sie auf ihre Geräte herunterladen können. Sie können Sie möchten Nutzer dazu bringen, häufiger mit Ihrer App zu interagieren, indem Sie die Anzahl der Daten, die Ihre App herunterladen muss.

Die grundlegendste Methode zur Reduzierung von Downloads besteht darin, nur das herunterzuladen, die Sie brauchen. Was Daten betrifft, bedeutet dies, REST APIs zu implementieren, mit denen Sie Abfragekriterien angeben, die die zurückgegebenen Daten einschränken, indem Sie Parameter wie den Zeitpunkt der letzten Aktualisierung.

Ebenso empfiehlt es sich beim Herunterladen von Bildern, die Größe der Bilder serverseitig hochladen, anstatt Bilder in voller Größe herunterzuladen, die nur auf der Kundschaft.

HTTP-Antworten im Cache speichern

Eine weitere wichtige Technik besteht darin, das Herunterladen doppelter Daten zu vermeiden. Sie können verringern Sie die Wahrscheinlichkeit, dass dieselben Daten wiederholt heruntergeladen werden, indem Sie Caching. Durch das Caching der Daten und Ressourcen Ihrer Anwendung erstellen Sie eine lokale Kopie der die Informationen enthalten, auf die sich Ihre App beziehen muss. Wenn Ihre App Zugriff auf dieselbe Information mehrmals innerhalb kurzer Zeit abrufen können, benötigen Sie um sie nur einmal in den Cache herunterzuladen.

Es ist wichtig, so offen wie möglich zwischenzuspeichern, um die Gesamtzahl der heruntergeladenen Daten. Statische Ressourcen immer im Cache speichern, einschließlich wie Bilder in voller Größe herunterladen können, solange dies vernünftigerweise möglich. On-Demand-Ressourcen sollten separat gespeichert werden, damit Sie Leeren Sie Ihren On-Demand-Cache regelmäßig, um seine Größe zu verwalten.

Um sicherzustellen, dass Ihre Caching-Daten nicht dazu führen, dass Ihre Anwendung veraltete Daten anzeigt, Verwenden Sie die entsprechenden HTTP-Statuscodes Header, wie die ETag und Last-Modified Header. So können Sie festlegen, wann der verknüpfte Content aktualisiert. Beispiel:

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;
}

Sie können einige Netzwerkbibliotheken so konfigurieren, dass diese Statuscodes und automatisch Header. Bei Verwendung OkHttp, z. B. die Konfiguration von Ein Cache-Verzeichnis und eine Cache-Größe für den Client ermöglicht es der Bibliothek, HTTP-Caching, wie im folgenden Codebeispiel gezeigt:

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();

Wenn der Cache konfiguriert ist, können Sie vollständig im Cache gespeicherte HTTP-Anfragen direkt bereitstellen. aus dem lokalen Speicher, wodurch die Notwendigkeit einer Netzwerkverbindung entfällt. Bedingt im Cache gespeicherte Antworten können ihre Aktualität vom Server validieren, da die Bandbreitenkosten für den Download entfallen. Nicht zwischengespeicherte Antworten für zukünftige Anfragen im Antwortcache gespeichert werden.

Sie können nicht sensible Daten im nicht verwalteten externen Cache-Verzeichnis zwischenspeichern, indem Sie mit Context.getExternalCacheDir() Alternativ können Sie Daten im verwalteten, sicheren Anwendungscache zwischenspeichern, indem Sie mit Context.getCacheDir() Beachte, dass dieser interne Cache geleert werden kann, wenn das System zur Neige geht. verfügbaren Speicher.

Repository verwenden

Für einen komplexeren Caching-Ansatz sollten Sie das Repository-Design in Betracht ziehen. Muster zu ändern. Dazu gehört das Erstellen einer benutzerdefinierten Klasse, einem sogenannten Repository. stellt eine API-Abstraktion über bestimmte Daten oder Ressourcen bereit. Das Repository Daten zunächst aus verschiedenen Quellen abrufen, z. B. von einem Remote-Webdienst, bei nachfolgenden Aufrufen jedoch eine im Cache gespeicherte Version der Daten zur Verfügung. Dieses Indirektionsebene ermöglicht es Ihnen, eine robuste Caching-Strategie bereitzustellen, die für Ihre App relevant sind. Weitere Informationen zur Verwendung des Repository-Musters Informationen in deiner App findest du im Leitfaden zur App Architektur.