최적화되지 않은 다운로드 방지

앱 사용자 중 일부가 인터넷에 간헐적으로 액세스하거나 제한이 있음 자신의 기기에 다운로드할 수 있는 정보의 양에 대해 말이죠. 다음과 같은 작업을 할 수 있습니다. 사용자가 앱과 더 자주 상호작용하도록 데이터를 저장할 수 있습니다.

다운로드를 줄이는 가장 기본적인 방법은 알 수 있습니다 데이터의 경우, REST API를 구현하여 다음과 같은 매개변수를 사용하여 반환된 데이터를 제한하는 쿼리 기준을 최종 업데이트 시간을 나타냅니다.

마찬가지로 이미지를 다운로드할 때는 다운로드 파일 크기를 줄이고 전체 크기의 이미지를 다운로드하는 대신 서버 측에서 실행할 수 있습니다

HTTP 응답 캐시

또 다른 중요한 기술은 중복된 데이터를 다운로드하지 않는 것입니다. 다음과 같은 작업을 할 수 있습니다. 같은 데이터를 반복적으로 다운로드할 가능성을 줄이고 제공합니다 앱의 데이터와 리소스를 캐시하여 앱에서 참조해야 하는 정보입니다. 앱에서 동일한 정보를 여러 번 반복하려면 캐시에 한 번만 다운로드합니다.

전체 프레임 속도를 줄이려면 최대한 적극적으로 다운로드되는 데이터의 양이 제한됩니다 다음을 포함한 정적 리소스를 항상 캐시: 원본 크기 이미지 등의 주문형 다운로드를 합리적인 수준에서 있습니다. 주문형 리소스를 별도로 저장해야 정기적으로 주문형 캐시를 플러시하여 크기를 관리합니다.

캐싱으로 인해 앱이 오래된 데이터를 표시하지 않도록 하려면 적절한 HTTP 상태 코드 및 헤더, 예: ETagLast-Modified 있습니다. 이를 통해 관련된 콘텐츠가 게시되어야 하는 시기를 새로고침합니다 예를 들면 다음과 같습니다.

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
}

자바

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

이러한 상태 코드를 따르도록 일부 네트워킹 라이브러리를 구성할 수 있으며 자동으로 헤더를 생성합니다. OkHttp, 예를 들어 클라이언트의 캐시 디렉터리와 캐시 크기를 통해 라이브러리에서 다음 코드 샘플과 같은 HTTP 캐싱

Kotlin

val cacheDir = Context.getCacheDir()
val cacheSize = 10L * 1024L * 1024L // 10 MiB
val client: OkHttpClient = OkHttpClient.Builder()
    .cache(Cache(cacheDir, cacheSize))
    .build()

자바

File cacheDir = Context.getCacheDir();
long cacheSize = 10L * 1024L * 1024L; // 10 MiB
OkHttpClient client = new OkHttpClient.Builder()
    .cache(new Cache(cacheDir, cacheSize))
    .build();

캐시가 구성되면 완전히 캐시된 HTTP 요청을 직접 제공할 수 있습니다. 네트워크 연결을 열 필요가 없습니다. 조건부로 캐시된 응답은 서버에서 최신 상태를 검증할 수 있습니다. 다운로드와 관련된 대역폭 비용을 없앱니다. 캐시되지 않은 응답 응답 캐시에 저장됩니다.

다음을 수행하여 관리되지 않는 외부 캐시 디렉터리에 민감하지 않은 정보를 캐시할 수 있습니다. 사용 Context.getExternalCacheDir() 또는 다음을 수행하여 관리되는 보안 애플리케이션 캐시에 데이터를 캐시할 수 있습니다. 사용 Context.getCacheDir() 이 내부 캐시는 시스템의 메모리 부족이나 스토리지 용량을 늘릴 수도 있습니다

저장소 사용

캐싱에 대한 보다 정교한 접근 방식을 원한다면 저장소 설계 고려 학습합니다. 이를 위해 저장소라고 하는 커스텀 클래스를 만듭니다. 특정 데이터 또는 리소스에 대한 API 추상화를 제공합니다. 저장소 처음에는 원격 웹 서비스와 같은 다양한 소스에서 데이터를 가져올 수 있습니다. 후속 호출에서 호출자에게 데이터의 캐시된 버전을 제공합니다. 이 강력한 캐싱 전략을 제공할 수 있으므로 확인할 수 있습니다 저장소 패턴 사용에 대한 자세한 내용 앱 가이드 아키텍처를 참고하세요.