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ć.

Podstawowym sposobem ograniczenia liczby pobrań jest pobieranie tylko potrzeby. 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. Buforowanie danych i zasobów aplikacji powoduje utworzenie lokalnej kopii które aplikacja musi się do niej odwoływać. Jeśli aplikacja musi mieć dostęp tych samych informacji wiele razy w krótkim czasie, aby tylko raz pobrać go do pamięci podręcznej.

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 oddzielnie, aby umożliwić Ci regularnie czyść pamięć podręczną na żądanie, aby zarządzać jej rozmiarem.

Aby mieć pewność, że przechowywanie w pamięci podręcznej nie spowoduje 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 bezpośrednio obsługiwać w pełni przechowywane żądania HTTP z pamięci lokalnej, eliminując konieczność korzystania z 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. Niebuforowane odpowiedzi są zapisywane 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

Aby zastosować bardziej zaawansowane podejście do buforowania, weź pod uwagę projekt repozytorium wzorcem. 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ć swoje dane z różnych źródeł, takich jak zdalna usługa sieciowa, lecz także przy kolejnych połączeniach udostępnia rozmówcom 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 .