Cómo utilizar Okhttp de manera eficiente
//
//d. /msg/android-developers/-694j87eXVU/YYs4b6kextwJ y
///q/4441849/400717.
final @Nullable Archivo baseDir = context.getCacheDir();
if (baseDir ! = null) {
final Archivo cacheDir = nuevo Archivo(baseDir, "HttpResponseCache");
okHttpClient.setCache(new Cache(cacheDir, HTTP_RESPONSE_ DISK_CACHE_MAX_SIZE));
}
//El directorio base es /a/ 32752861/400717 recomendado.
// Basado en
//d/msg/android-developers/-694j87eXVU/YYs4b6kextwJ y
//q/4441849/400717 para protegerse contra nulo.
final @ NullableFilebaseDir = context.getCacheDir();
if (baseDir ! = null) {
final FilecacheDir = nuevo archivo(baseDir, "HttpResponseCache" );
okHttpClient.setCache(new Cache(HttpResponseCache))setCache(new Cache(cacheDir, HTTP_RESPONSE_ DISK_CACHE_MAX_SIZE));
}
En Khan Academy en En el programa, especificamos HTTP_RESPONSE_DISK_CACHE_MAX_SIZE como 10 * 1024 * 1024, que es un tamaño de 10 MB.
2. Integra Stetho
Stetho es una hermosa biblioteca proporcionada por Facebook para usar la función de herramientas de desarrollo de Chrome. inspecciona sus aplicaciones de Android.
Además de inspeccionar la base de datos SQLite de su aplicación, Stetho le permite ver la jerarquía de vistas. Le permite inspeccionar cada solicitud y respuesta iniciada por OkHttp:
Este mecanismo de introspección es útil para garantizar que el servidor devuelva encabezados HTTP que permitan el almacenamiento en caché de recursos y para verificar que los recursos almacenados en caché existen cuando no se solicitan. networkInterceptors().add(newStethoInterceptor());
Luego, ejecute la aplicación e ingrese chrome://inspect cuando abra el navegador. Luego haga clic derecho y seleccione Inspeccionar para abrir las herramientas de desarrollador, luego abra una nueva pestaña y comience a monitorear las solicitudes OkHttp.
3. Utilice Picasso y Retrofit
Es posible que haya utilizado Picasso para cargar imágenes web o Retrofit para simplificar la decodificación de solicitudes y respuestas. Si no especifica esto explícitamente, estas bibliotecas de terceros crearán implícitamente su propio OkHttpClient para uso interno.
Clase OkHttpDownloader en Picasso versión 2.5.2:
privado estático OkHttpClient defaultOkHttpClient() {
Cliente OkHttpClient = nuevo OkHttpClient();
client.setConnectTimeout(Utils.DEFAULT_CONNECT_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
Cliente. DEFAULT_READ_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
client.setWriteTimeout(Utils.DEFAULT_WRITE_TIMEOUT_MILLIS, TimeUnit.MILLIS, TimeUnit.MILLISECONDS
Cliente. MILLISECONDS);
devolver cliente;
}
okHttpClientdefaultOkHttpClient() estático privado() {
OkHttpClientclient = nuevo OkHttpClient(); p> p>
client.setConnectTimeout(Utils.DEFAULT_CONNECT_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
El cliente establece el tiempo de espera de lectura (Utils.DEFAULT_READ_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
El cliente establece el tiempo de espera de escritura (Utils.DEFAULT_ WRITE_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS, TimeUnit.MILLISECONDSMILLISECONDS
Regreso al cliente
}
La actualización tiene A; Método de fábrica similar para crear su propio OkHttpClient.
Las imágenes a menudo se encuentran en recursos más grandes que deben cargarse dentro de la aplicación. Aunque Picasso mantiene su propio mecanismo LRU para almacenar imágenes en caché, este mecanismo se aplica estrictamente en la memoria. Si un cliente intenta cargar una imagen usando Picasso, Picasso no podrá encontrar la memoria caché de la imagen y luego delegar la carga de la imagen a su instancia interna de OkHttpClient. De forma predeterminada, esta instancia siempre cargará recursos de imágenes desde el servidor.
Los métodos que pertenecen a defaultOkHttpClient no se pueden combinar con la configuración de caché de respuesta en el sistema de archivos descrito anteriormente.
Especificar su propia instancia de OkHttpClient permite que los datos sean devueltos desde el sistema de archivos para almacenar en caché la respuesta sin cargar la imagen desde el servidor. Esto es muy importante después de iniciar el programa por primera vez. En este punto, la memoria caché de Picasso está fría.
Por lo tanto, a menudo delegará en la instancia de OkHttpClient la carga de imágenes.
Si usa
Picasso.with(context).load(...) en su código, necesita crear una instancia de OkHttpClient que configure Picasso.
Picasso.with(context).load(...)
Para cargar la imagen, utiliza el modo singleton de Picasso. Se trata de crear instancias y configurar su propio OkHttpClient en modo diferido mediante el método with. Por lo tanto, tenemos que llamar a nuestra propia instancia de Picasso mediante el método wiht antes del singleton.
Para lograr esto, simplemente envuelva la instancia OkHttpClient en un OkHttpDownloader y páselo al método de descarga de la instancia Picasso.Builder.
Picasso final Picasso = nuevo Picasso.Builder(contexto)
.downloader(nuevo OkHttpDownloader(okHttpClient))
.setSingletonInstance(picasso);
final Picassopicasso = nuevo Picasso.Builder(contexto)
.
.downloader(nuevo OkHttpDownloader(okHttpClient))
.build();
// Los clientes deben inyectar esta instancia cuando sea necesario, pero deben reemplazar la instancia singleton
// por si acaso. setSingletonInstance(picasso);
Para usar una instancia de OkHttpClient en Retrofit, debe modificar uno de los RestAdapters en 1.9.x y envolver OkHttpClient en una instancia de OkClient. Luego, esto se pasa al método setClient de la instancia RestAdapter.Builder.
restAdapterBuilder.setClient(new OkClient(httpClient));
restAdapterBuilder.setClient(new OkClient(httpClient));
En Retrofit 2.0, simplemente pase OkHttpClient al método cliente de la instancia Retrofit.Builder.
En la aplicación Khan Academy, utilizamos la inyección de dependencia de Dagger para garantizar que solo tengamos una instancia de OkHttpClient.
Proporcionamos un ejemplo de anotación que proporciona un modo singleton para instancias de OkHttpClient:
@Provides
@Singleton
public OkHttpClient okHttpClient (contexto de contexto final, . .. .) {
final OkHttpClient okHttpClient = new OkHttpClient();
configureClient(okHttpClient, ...) )
return okHttpClient;
}
@Provides
@Singleton
public OkHttpClientokHttpClient(final Contextcontext, ....) {
final OkHttpClientokHttpClient = new OkHttpClient();
configureClient(okHttpClient, ...) )
return okHttpClient;
}
OkHttpClient creará un instancia y proporcionárselo a nuestro Picasso y Retrofit a través de anotaciones Dagger.
4. Especificar el interceptor de agente de usuario
Cuando el cliente proporciona un valor de encabezado de agente de usuario detallado en cada solicitud, los archivos de registro y el análisis nos proporcionarán información más útil. De forma predeterminada, Okhttp solo incluye el valor User-Agent en versiones específicas de Okhttp. Para especificar nuestro propio agente de usuario, primero debemos crear una anulación para el interceptor; podemos seguir los consejos de stackoverflow.
La clase final pública UserAgentInterceptor implementa Interceptor {
Cadena final estática privada USER_AGENT_HEADER_NAME = "Agente de usuario "
Cadena final privada userAgentHeaderValue
<; p> public UserAgentInterceptor(String userAgentHeaderValue) {this.checkNotNull(userAgentHeaderValue);
}
@Override
respuesta de intercepción pública (Cadena de cadena) lanza IOException {
final Request originalRequest = chain.request();
final Request requestWithUserAgent = originalRequest .newBuilder()
.removeHeader( USER_AGENT_HEADER_NAME)
.addHeader(USER_AGENT_HEADER_NAME, userAgentHeaderValue)
.build();
return chain.proceed(requestWithUserAgent);
}
}
Clase final pública UserAgentInterceptor implementa Interceptor {
Cadena final estática privada USER_AGENT_HEADER_NAME = "Agente de usuario"
privada; final String userAgentHeaderValue;
public UserAgentInterceptor(String userAgentHeaderValue) {
this.userAgentHeaderValue = Preconditions.checkNotNull( userAgentHeaderValue);
}
@Override
public Responseintercept(Chainchain) lanza IOException {
final RequestoriginalRequest = chain.request();
final RequestrequestWithUserAgent = originalRequest.newBuilder()
.removeHeader(USER_AGENT_HEADER_NAME)
.addHeader(USER_AGENT_HEADER_NAME, userAgentHeaderValue)
.build();
return chain.proceed( requestWithUserAgent
}
}
Para crear el valor del encabezado User-Agent y pasarlo al constructor de UserAgentInterceptor, utilice cualquier información que tenga. BRAND o "Información relacionada con la marca y el producto/hardware visible para el consumidor"
Build.VERSION.SDK_INT o "Número de versión del SDK visible para el consumidor proporcionado por Android"
BuildConfig.APPLICATION_ID p>
BuildConfig.VERSION_NAME
BuildConfig.VERSION_CODE
Los últimos tres valores constan del ID de la aplicación, VERSIONCODE y VERSIONCODE. Valores VERSIONCODE y VERSIONNAME en nuestro script de compilación de Gradle
Para obtener más información, puede consultar Control de versiones de aplicaciones con Gradle y Configuración de ID de aplicaciones
Tenga en cuenta que si su aplicación usa WebView, puede configurarla para use el mismo valor de encabezado User-Agent, puede crear un UserAgentInterceptor mediante:
WebSettings settings = webView.setting.setUserAgentString(userAgentHeaderValue
WebSettingssettings = webView.getSettings();
settings.setUserAgentString(userAgentHeaderValue);
5. Especifique un período de tiempo de espera razonable
Antes de la versión 2.5.0, las solicitudes OkHttp nunca expiran de forma predeterminada. Después de 2.5.0, si se agota el tiempo de espera de una solicitud para establecer una conexión, la solicitud nunca expirará si no se ha leído el siguiente byte leído de la conexión o el siguiente byte escrito en la conexión. Para hacerlo, es necesario actualizar a la versión 2.5.0 y no necesitamos corregir errores en el código. La razón es simple porque utilizamos el camino equivocado la primera vez.
Para anular estos valores predeterminados, llame a setConnectTimeout, setReadTimeout o setWriteTimeout respectivamente.
Cabe señalar que cuando Picasso y Retrofit especifican diferentes valores de tiempo de espera para la instancia de OkHttpClient, de forma predeterminada
Picasso especifica:
La conexión supera los 15 segundos.
La lectura tarda más de 20 segundos
La escritura tarda más de 20 segundos
Y Retrofit especifica:
La conexión tarda más de 15 segundos .
Lectura de más de 20 segundos
Sin tiempo de espera de escritura
Al configurar la propia instancia OkHttpClient de Picasso y Retrofit, puede asegurarse de que todos los tiempos de espera de las solicitudes sean consistentes