Einige Nutzer Ihrer App haben nur sporadisch Zugriff auf das Internet oder es gibt Einschränkungen bei der Menge an Informationen, die sie auf ihre Geräte herunterladen können. Sie können Nutzer dazu anregen, häufiger mit Ihrer App zu interagieren, indem Sie die Menge der Daten reduzieren, 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 innerhalb kurzer Zeit mehrmals auf dieselbe Information zugreifen muss, müssen Sie sie nur einmal in den Cache herunterladen.
Es ist wichtig, so offen wie möglich zwischenzuspeichern, um die Gesamtzahl der heruntergeladenen Daten. Speichern Sie statische Ressourcen, einschließlich On-Demand-Downloads wie Bilder in Originalgröße, so lange wie möglich im Cache. On-Demand-Ressourcen sollten separat gespeichert werden, damit Sie den On-Demand-Cache regelmäßig leeren und so seine Größe verwalten können.
Damit Ihr Cache nicht dazu führt, dass Ihre App veraltete Daten anzeigt, verwenden Sie die entsprechenden HTTP-Statuscodes und ‑Header, z. B. die Header ETag
und Last-Modified
. So können Sie festlegen, wann die zugehörigen Inhalte aktualisiert werden sollen. 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. Wenn Sie beispielsweise OkHttp verwenden, können Sie ein Cache-Verzeichnis und eine Cache-Größe für den Client konfigurieren, damit die Bibliothek HTTP-Caching verwenden kann, 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, wodurch die Bandbreitenkosten verschafft werden, die mit dem Download verbunden sind. Nicht im Cache gespeicherte Antworten werden für zukünftige Anfragen im Antwortcache gespeichert.
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()
Hinweis: Dieser interne Cache wird möglicherweise geleert, wenn der verfügbare Speicherplatz des Systems knapp wird.
Repository verwenden
Für einen ausgefeilteren Ansatz zum Caching können Sie das Repository-Designmuster verwenden. 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, stellt Anrufern 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.