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. W przypadku danych oznacza to implementację interfejsów API REST, które umożliwiają określenie kryteriów zapytania ograniczających zwracane dane za pomocą parametrów takich jak czas ostatniej aktualizacji.

Podobnie w przypadku pobierania obrazów warto zmniejszyć ich rozmiar po stronie serwera, zamiast pobierać obrazy w pełnym rozmiarze, które są zmniejszane po stronie 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 jak najwięcej danych było przechowywane w pamięci podręcznej, ponieważ zmniejsza to łączną 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 spowoduje wyświetlania przez aplikację nieaktualnych danych, używaj odpowiednich kodów stanu HTTP i nagłówków HTTP, takich jak nagłówki ETagLast-Modified. Dzięki temu możesz określić, kiedy powiązane treści powinny zostać odświeżone. 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;
}

Niektóre biblioteki sieciowe możesz skonfigurować tak, aby automatycznie uwzględniały te kody stanu i nagłówki. 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 z internetem. 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() Pamiętaj, że ta wewnętrzna pamięć podręczna może zostać wyczyszczona, gdy systemowi zabraknie dostępnej pamięci.

Korzystanie z repozytorium

Jeśli chcesz zastosować bardziej zaawansowane podejście do buforowania, weź pod uwagę projekt repozytorium wzorcem. Polega to na utworzeniu niestandardowej klasy zwanej repozytorium, która zapewnia abstrakcję interfejsu API dla określonych danych lub zasobów. Repozytorium może początkowo pobierać swoje dane z różnych źródeł, takich jak zdalna usługa sieciowa, lecz także przy kolejnych połączeniach udostępnia rozmówcy wersję danych z pamięci podręcznej. Ten warstwa pośredniej pozwala zapewnić solidną strategię buforowania, która do Twojej aplikacji. Więcej informacji o używaniu wzorca repozytorium w aplikacji, zapoznaj się z Przewodnikiem po aplikacji .