Unikaj pobierania niezoptymalizowanych plików

Niektórzy użytkownicy Twojej aplikacji mają niestabilny dostęp do internetu lub obowiązują limity na to, ile informacji mogą pobrać na swoje urządzenia. Dostępne opcje zachęcaj użytkowników do częstszego korzystania z aplikacji, ograniczając ilość danych, które aplikacja musi pobrać.

Najprostszym sposobem na ograniczenie liczby pobrań jest pobieranie tylko tego, czego potrzebujesz. Jeśli chodzi o dane, oznacza to wdrożenie interfejsów API typu REST, które umożliwiają określić kryteria zapytania, które ograniczają zwracane dane za pomocą parametrów takich jak czas ostatniej aktualizacji.

Podobnie przy pobieraniu obrazów dobrze jest zmniejszyć rozmiar obrazów po stronie serwera, zamiast pobierać obrazy w pełnym rozmiarze na klienta.

Buforowanie odpowiedzi HTTP

Inną ważną metodą jest unikanie pobierania zduplikowanych danych. Dostępne opcje zmniejsz prawdopodobieństwo wielokrotnego pobierania tych samych danych przez buforowanie. Przechowując dane i zasoby aplikacji w pamięci podręcznej, tworzysz lokalną kopię informacji, do których aplikacja musi się odwoływać. Jeśli aplikacja musi uzyskać dostęp do tego samego elementu informacji kilka razy w krótkim czasie, musisz pobrać go do pamięci podręcznej tylko raz.

Ważne jest, aby intensywniej buforować dane w pamięci podręcznej w celu zmniejszenia łącznej ilość pobieranych danych. Zawsze przechowuj w pamięci podręcznej zasoby statyczne, w tym pobierania na żądanie, takich jak obrazy w pełnym rozmiarze, jak to tylko możliwe. Zasoby na żądanie powinny być przechowywane osobno, aby umożliwić regularne czyszczenie pamięci podręcznej na żądanie w celu zarządzania jej rozmiarem.

Aby mieć pewność, że buforowanie nie powoduje wyświetlania przez aplikację nieaktualnych danych: użyj odpowiednich kodów stanu HTTP oraz nagłówki, takich jak ETag. oraz Last-Modified nagłówki. Pozwoli Ci to określić, kiedy powiązane treści odświeżony. Na przykład:

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

Możesz skonfigurować niektóre biblioteki sieciowe tak, aby uwzględniały te kody stanu automatycznie. W przypadku użycia funkcji OkHttp, na przykład konfigurując katalogu pamięci podręcznej i rozmiaru pamięci podręcznej klienta, aby biblioteka mogła Buforowanie HTTP, jak w tym przykładowym kodzie:

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

Po skonfigurowaniu pamięci podręcznej możesz obsługiwać żądania HTTP w pełnym zakresie z pamięci podręcznej, co eliminuje konieczność otwierania połączenia sieciowego. Warunkowo zapisywane odpowiedzi w pamięci podręcznej mogą sprawdzać aktualność informacji z serwera, eliminując koszty przepustowości związane z pobieraniem. Odpowiedzi nieprzechowywane w pamięci podręcznej są przechowywane w pamięci podręcznej odpowiedzi na potrzeby przyszłych żądań.

Dane niewrażliwe możesz umieścić w pamięci podręcznej w katalogu niezarządzanej zewnętrznej pamięci podręcznej przez za pomocą Context.getExternalCacheDir() Możesz też buforować dane w zarządzanej, bezpiecznej pamięci podręcznej aplikacji przez za pomocą Context.getCacheDir() Wewnętrzna pamięć podręczna może zostać opróżniona, gdy w systemie zacznie kończyć się dostępnej pamięci.

Użyj repozytorium

Jeśli chcesz zastosować bardziej zaawansowane podejście do buforowania, rozważ użycie wzorca Repository. Wymaga to utworzenia klasy niestandardowej znanej jako repozytorium, która zapewnia abstrakcję interfejsu API dla określonych danych lub zasobów. Repozytorium może początkowo pobierać dane z różnych źródeł, takich jak zdalna usługa internetowa, ale w kolejnych wywołaniach przekazuje wywołującym wersję danych z pamięci podręcznej. Ten warstwowy mechanizm pośrednictwa umożliwia stosowanie skutecznej strategii buforowania, która jest dostosowana do Twojej aplikacji. Więcej informacji o używaniu w aplikacji wzorca repozytorium znajdziesz w przewodniku Architektura aplikacji.