OkHttp Interceptor 및 Retrofit을 사용한 캐싱

8084 단어 android
저는 Amit Shekhar , 개발자들이 고임금 기술직을 구하도록 돕는 멘토입니다.

이 블로그에서는 오프라인 우선 Android 앱을 빌드하기 위해 OkHttp Interceptor 및 Retrofit을 사용하여 Android에서 HTTP 응답을 캐시하는 방법을 알아봅니다.

이 문서는 원래 amitshekhar.me에 게시되었습니다.

캐싱이 Android 애플리케이션에서 어떻게 도움이 되는지 이해해 봅시다.
  • 서버에서 데이터를 가져오기 위해 네트워크 호출을 할 때.
  • 처음으로 서버에서 데이터를 가져오고 HTTP 응답을 클라이언트에 캐시합니다.
  • 그런 다음 동일한 API를 다시 호출하면 캐시에서 즉시 데이터를 반환합니다.

  • 이렇게 하면 Android 애플리케이션에서 두 가지 매우 중요한 작업을 수행할 수 있습니다.
  • 인터넷에 연결되어 있지 않아도 작동합니다. 이는 오프라인 우선 앱을 구축하는 데 도움이 될 것입니다.
  • 응답이 로컬로 캐시되므로 더 빠르게 작업할 수 있습니다.

  • 이제 OkHttp 및 Retrofit에서 캐싱을 활성화하는 방법을 알아보겠습니다. 그 전에 Retrofit이 HTTP 작업에 OkHttp 클라이언트를 사용한다는 점을 이해해야 합니다. 즉, 캐싱을 활성화하기 위해 수행해야 하는 모든 작업은 OkHttp와 관련이 있어야 합니다. Retrofit은 구성된 OkHttp 클라이언트를 사용하므로 추가 작업을 수행할 필요가 없습니다.

    서버에서 이미 Cache-Control 헤더를 활성화하면 상황이 더 쉬워집니다. 그러면 OkHttp는 해당 헤더를 존중하고 서버에서 전송되는 특정 시간 동안 응답을 캐시합니다.

    그러나 Cache-Control가 서버에서 활성화되어 있지 않으면 어떻게 됩니까? 여전히 Interceptor를 사용하여 OkHttp 클라이언트의 응답을 캐시할 수 있습니다. 우리는 방법을 배울 것입니다.

    이를 위해 아래와 같이 Interceptor를 구현해야 합니다.

    class CacheInterceptor : Interceptor {
        override fun intercept(chain: Interceptor.Chain): Response {
            val response: Response = chain.proceed(chain.request())
            val cacheControl = CacheControl.Builder()
                .maxAge(10, TimeUnit.DAYS)
                .build()
            return response.newBuilder()
                .header("Cache-Control", cacheControl.toString())
                .build()
        }
    }
    


    여기에서 CacheInterceptor를 구현하여 Interceptor를 생성했으며 CacheControl에 대한 헤더를 제공하는 데 사용되는 Cache-Control 빌더가 있습니다.

    그런 다음 CacheInterceptor를 사용하여 이 OkHttpClientaddNetworkInterceptor에 추가해야 합니다.

    val okHttpClient = OkHttpClient().newBuilder() 
    .addNetworkInterceptor(CacheInterceptor())
    .build();
    


    그런 다음 이okHttpClient를 직접 또는 Retrofit과 함께 사용할 수 있습니다.

    그러나 오프라인 우선 앱을 구축하면서 이해해야 할 캐치가 있습니다.

    OkHttp는 인터넷을 사용할 수 있을 때만 캐시된 응답을 반환하도록 설계되었습니다.
  • 인터넷을 사용할 수 있고 데이터가 캐시된 경우에만 캐시에서 데이터를 반환합니다.
  • 데이터가 캐시되어 있지만 인터넷을 사용할 수 없는 경우에도 "사용 가능한 인터넷 없음"오류와 함께 반환됩니다.

  • 이 문제를 해결하는 방법?

    위의 것( ForceCacheInterceptor , 서버에서 CacheInterceptor 헤더가 활성화되지 않은 경우에만) 외에 Cache-Control 를 만들 수 있습니다.

    class ForceCacheInterceptor : Interceptor {
        override fun intercept(chain: Interceptor.Chain): Response {
            val builder: Request.Builder = chain.request().newBuilder()
            if (!IsInternetAvailable()) {
                builder.cacheControl(CacheControl.FORCE_CACHE);
            }
            return chain.proceed(builder.build());
        }
    }
    


    그런 다음 아래와 같이 OkHttpClient에 인터셉터를 추가합니다.

    val okHttpClient = OkHttpClient().newBuilder()
    .addNetworkInterceptor(CacheInterceptor()) // only if Cache-Control header is not enabled from the server
    .addInterceptor(ForceCacheInterceptor())
    .build();
    


    여기서 ForceCacheInterceptor가 아닌 OkHttpClient를 사용하여 addInterceptor()addNetworkInterceptor()를 추가하고 있음을 알아야 합니다.
  • addInterceptor : 응용 프로그램 수준에서 인터셉터를 추가하는 데 사용됩니다.
  • addNetworkInterceptor : 이름에서 알 수 있듯이 네트워크 수준에서 인터셉터를 추가하는 데 사용됩니다.

  • 그런 다음 이okHttpClient를 직접 또는 Retrofit과 함께 사용할 수 있으며 예상대로 작동합니다.

    오프라인 우선 Android 앱을 빌드하기 위해 OkHttp Interceptor 및 Retrofit을 사용하여 Android에서 HTTP 응답을 캐시하는 방법입니다.

    지금은 그게 다입니다.

    감사

    Amit Shekhar

    다음에서 나와 연결할 수 있습니다.


  • GitHub
  • Facebook
  • 좋은 웹페이지 즐겨찾기