OKHTTP agrega interceptor y caché

Los interceptores se dividen en:
interceptor de aplicaciones (addInterceptor)
se utiliza principalmente para ver información de solicitud y devolver información, como dirección de enlace, información de encabezado, información de parámetros, etc. El
interceptor de red (addNetworkInterceptor)
puede agregar, eliminar o reemplazar información de encabezado de solicitud, y También puede cambiar la entidad que lleva la solicitud.

El almacenamiento en caché significa literalmente almacenamiento en caché... Con el almacenamiento en caché, su aplicación puede mostrar normalmente los datos previamente almacenados en caché incluso cuando no hay red . Si no es necesario cambiar los datos durante mucho tiempo, el uso del almacenamiento en caché puede mejorar la eficiencia y reducir la interacción con el servidor. tráfico generado.

Teatro de preguntas y respuestas:

Pregunta: Agregué un caché, ¿por qué no puedo leer el caché cuando no hay red o todavía aparece un problema de red?

Respuesta: El caché requiere ciertos campos (Cache-Control). Si ha agregado el caché normalmente y ya tiene un archivo de caché localmente, significa que faltan estos campos.

Solución:
1. Deje que el servidor agregue este campo
2. Escriba un interceptor para agregar este campo

Operación real:
agregar cachés e interceptores se realiza en OkHttpClient.Builder (), de la siguiente manera:
inserte la descripción de la imagen aquí

OkHttpClient client = new OkHttpClient.Builder()
       .connectTimeout(10, TimeUnit.SECONDS) //连接超时阈值
       .writeTimeout(10, TimeUnit.SECONDS) //写超时阈值
       .readTimeout(10, TimeUnit.SECONDS)  //读超时阈值
       .retryOnConnectionFailure(true) //当失败后重试
       .addNetworkInterceptor(new CacheInterceptor())//添加网络拦截器-设置缓存
       .addInterceptor(new LoggingInterceptor())//添加应用拦截器-日志拦截器
       .cache(new Cache(new File(this.getExternalCacheDir(), "okhttpcache"), 10 * 1024 * 1024))//添加缓存
       .build();
 Request request = new Request.Builder().url("https://www.wanandroid.com//hotkey/json").build();

Aquí se utiliza la prueba de API abierta para reproducir Android, el método de solicitud no se escribe y la solicitud se realiza una vez. En este momento, agregue el caché en la memoria del teléfono, abra el espacio del teléfono Android - datos - el nombre del paquete de su aplicación
- cache - okhttpcache,
encontrará que hay tres archivos en él. En este momento, significa que el caché se ha realizado correctamente. Hay un archivo con los sufijos 0 y 1. No se puede abrir normalmente. Después de cambiarlo a . txt, encontrará que es el contenido de los datos el que se debe devolver.

Interceptor de caché

class CacheInterceptor implements Interceptor {
    
    

        @Override
        public Response intercept(Chain chain) throws IOException {
    
    

            Response originResponse = chain.proceed(chain.request());

            //设置缓存时间为60秒,并移除了pragma消息头,移除它的原因是因为pragma也是控制缓存的一个消息头属性
            return originResponse.newBuilder().removeHeader("pragma")
                    .header("Cache-Control","max-age=600").build();
        }
    }

Registro Interceptor

    public class LoggingInterceptor implements Interceptor {
    
    
        @Override
        public Response intercept(Interceptor.Chain chain) throws IOException {
    
    
            //这个chain里面包含了request和response,所以你要什么都可以从这里拿
            Request request = chain.request();

            long t1 = System.nanoTime();//请求发起的时间
            Log.i("dt",String.format("发送请求 %s on %s%n%s",
                    request.url(), chain.connection(), request.headers()));

            Response response = chain.proceed(request);


            long t2 = System.nanoTime();//收到响应的时间

            //这里不能直接使用response.body().string()的方式输出日志
            //因为response.body().string()之后,response中的流会被关闭,程序会报错,我们需要创建出一
            //个新的response给应用层处理
            ResponseBody responseBody = response.peekBody(1024 * 1024);

            Log.i("dt",String.format("接收响应: [%s] %n返回json:【%s】 %.1fms%n%s",
                    response.request().url(),
                    responseBody.string(),
                    (t2 - t1) / 1e6d,
                    response.headers()));

            return response;
        }
    }

Los interceptores se escriben básicamente de la misma manera, dependiendo de cómo los agregue a OKHTTP.

Lo anterior es agregar el caché a través del interceptor de red y agregar el registro de solicitudes mediante el interceptor de aplicaciones.

Gracias a estos dos artículos por informarme sobre los interceptores y el almacenamiento en caché
de Android OkHttp Interceptor (Interceptor) para
solucionar el problema de almacenamiento en caché en OkHttp.

Supongo que te gusta

Origin blog.csdn.net/As_thin/article/details/124248663
Recomendado
Clasificación