Дублирующие загрузки являются избыточными

Наиболее фундаментальным способом уменьшить загрузки это загружать только то, что вам нужно. С точки зрения данных это означает, что необходимо реализовать REST API, позволяющее указать критерии запроса, которые ограничивают возвращаемые данные, используя такие параметры как время вашего последнего обновления.

Аналогично, при загрузке изображений, хорошей практикой является уменьшения размера изображений на стороне сервера вместо загрузки полноразмерных изображения с последующим уменьшением размера на стороне клиента.

Локальное кэширование файлов

Очень важно также избегать загрузки повторяющихся данных. Вы можете сделать это используя агрессивное кэширование. Всегда кэшируйте статические ресурсы, в том числе загружаемые по необходимости, такие как полноразмерные изображения, и храните их так долго, как это возможно. Ресурсы, загружаемые по требованию, должны храниться отдельно, чтобы вы могли регулярно очищать кэш по требованию для управления его размером.

Чтобы убедиться, что кэширование не приводит к отображению устаревших данные, не забудьте извлечь из заголовков HTTP ответа время, когда запрашиваемый контент был обновлен, и когда истекает время актуальности данных. Это позволит вам определить, когда соответствующий контент должен быть обновлен.

long currentTime = System.currentTimeMillis());

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

long expires = conn.getHeaderFieldDate("Expires", currentTime);
long lastModified = conn.getHeaderFieldDate("Last-Modified", currentTime);

setDataExpirationDate(expires);

if (lastModified < lastUpdateTime) {
  // Skip update
} else {
  // Parse update
}

Используя этот подход, можно также эффективно кэшировать динамическое содержимое, но необходимо обеспечить при этом, чтобы это не приводило к отображению устаревших данных.

Можно кэшировать несекретные данные во внешнем каталоге кэша:

Context.getExternalCacheDir();

Кроме того, можно использовать управляемый/безопасный кэш приложения. Заметим, что этот внутренний кэш может быть очищен, когда система работает в условиях нехватки доступной памяти.

Context.getCache();

Файлы, хранящиеся в любом кэше будут стерты, когда приложение будет удалено.

Кэширование HttpURLConnection ответа

В Android 4.0 добавили кэш ответов HttpURLConnection. Вы можете включить кэширование HTTP ответов на поддерживаемых устройствах с помощью reflection как показано в следующем примере:

private void enableHttpResponseCache() {
  try {
    long httpCacheSize = 10 * 1024 * 1024; // 10 MiB
    File httpCacheDir = new File(getCacheDir(), "http");
    Class.forName("android.net.http.HttpResponseCache")
         .getMethod("install", File.class, long.class)
         .invoke(null, httpCacheDir, httpCacheSize);
  } catch (Exception httpResponseCacheNotAvailable) {
    Log.d(TAG, "HTTP response cache is unavailable.");
  }
}

Этот пример кода включает кэш ответов на Android 4.0+ устройствах, не затрагивая более ранние релизы.

С установленным кэшем, полностью закэшированные HTTP запросы могут быть извлечены непосредственно из локального хранилища, без необходимости открытия сетевого подключение. Условно закэшированные ответы могут проверить свою актуальность на сервере, что исключает связанные с сетевым трафиком затраты.

Ещё незакэшированные ответы помещаются в хранилище кэша для будущих запросов.