Nicht optimierte Downloads vermeiden

Einige Nutzer Ihrer App haben zeitweise Zugriff auf das Internet oder die Menge der Informationen, die sie auf ihre Geräte herunterladen können, ist beschränkt. Du kannst Nutzer zu einer häufigeren Interaktion mit deiner App bewegen, indem du die Datenmenge, die deine App herunterladen muss, reduzieren.

Die grundlegendste Möglichkeit zur Reduzierung von Downloads besteht darin, nur das herunterzuladen, was Sie benötigen. In Bezug auf Daten bedeutet dies, REST APIs zu implementieren, mit denen Sie Abfragekriterien festlegen können, die die zurückgegebenen Daten mithilfe von Parametern wie dem Zeitpunkt der letzten Aktualisierung einschränken.

Ebenso empfiehlt es sich beim Herunterladen von Bildern, die Größe der Bilder serverseitig zu reduzieren, anstatt Bilder in voller Größe herunterzuladen, die auf dem Client reduziert werden.

HTTP-Antworten im Cache speichern

Eine weitere wichtige Technik besteht darin, das Herunterladen doppelter Daten zu vermeiden. Durch Caching können Sie die Wahrscheinlichkeit verringern, dass dieselben Daten wiederholt heruntergeladen werden. Durch das Caching der Daten und Ressourcen Ihrer Anwendung erstellen Sie eine lokale Kopie der Informationen, auf die Ihre Anwendung verweisen 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 im Cache zu speichern, um die Gesamtmenge der heruntergeladenen Daten zu reduzieren. Statische Ressourcen, einschließlich On-Demand-Downloads wie Bilder in voller Größe, sollten immer so lange wie möglich im Cache gespeichert werden. On-Demand-Ressourcen sollten separat gespeichert werden, damit Sie Ihren On-Demand-Cache regelmäßig leeren können, um seine Größe zu verwalten.

Damit das Caching nicht dazu führt, dass die Anwendung 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 der zugehörige Inhalt aktualisiert werden soll. 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 Header automatisch berücksichtigt werden. Wenn Sie beispielsweise OkHttp verwenden, kann die Bibliothek HTTP-Caching verwenden, wenn Sie beispielsweise ein Cache-Verzeichnis und eine Cache-Größe für den Client konfigurieren, 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 aus dem lokalen Speicher bereitstellen, sodass Sie keine Netzwerkverbindung öffnen müssen. Bedingt im Cache gespeicherte Antworten können ihre Aktualität vom Server validieren, wodurch die mit dem Download verbundenen Bandbreitenkosten eliminiert werden. Nicht zwischengespeicherte Antworten werden für zukünftige Anfragen im Antwortcache gespeichert.

Sie können nicht sensible Daten mit Context.getExternalCacheDir() im nicht verwalteten externen Cache-Verzeichnis zwischenspeichern. Alternativ können Sie Daten mit Context.getCacheDir() im verwalteten, sicheren Anwendungscache zwischenspeichern. Beachten Sie, dass dieser interne Cache möglicherweise geleert wird, wenn nur noch wenig Speicherplatz verfügbar ist.

Repository verwenden

Ein komplexerer Ansatz für das Caching ist das Designmuster für Repositories. Dazu gehört das Erstellen einer benutzerdefinierten Klasse, auch Repository genannt, die eine API-Abstraktion bestimmter Daten oder Ressourcen bietet. Das Repository kann seine Daten anfänglich aus verschiedenen Quellen abrufen, z. B. aus einem Remote-Webdienst, stellt aber bei nachfolgenden Aufrufen eine im Cache gespeicherte Version der Daten zur Verfügung. Mit dieser Indirektionsebene können Sie eine robuste, anwendungsspezifische Caching-Strategie festlegen. Weitere Informationen zur Verwendung des Repository-Musters in Ihrer Anwendung finden Sie im Leitfaden zur Anwendungsarchitektur.