Con el desarrollo de Android hasta el presente, el marco de red se ha actualizado, y actualmente hay cuatro marcos maduros principales. Este artículo analiza brevemente los principios de implementación de los marcos principales. Para un uso específico, consulte el enlace que figura en el artículo.
Marco principal de Android
Retrofit
Okhttp
Voleo
AsyncHttpClient
Retrofit
Caracteristicas
- Proxy dinámico
- Adaptar objeto de llamada de conversión
- Análisis de funciones, solicitud de red y conversión de datos.
Interfaz
public interface ApiService{
// 与Rxjava结合使用
@POST(NetUrl.HOME_URL)
public Obserable<HttpResult<HomeResponse>> getHomeList(@BODY BodyRequest body);
@GET(NetUrl.VERSION_URL)
public Obserable<HttpResult<VersionResponse>> getVersionDetail();
// 没有添加Call回调处理,直接返回Okhttp的Call
@Get(NetUrl.USER_URL)
public Call<HttpResult<UserResponse>> getUser(@Query("uid") long uid)
}
Principio
imagen
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Config.BASE_URL) // baseUrl 以/结尾
.addCallAdapterFactory(RxJava2CallAdapterFactory.create()) // 添加Call回调
.addConverterFactory(GsonConverterFactory.create()) // 解析器
.client(okHttpClient) //配置okHttpClient
.build();
ApiService service = retrofit.create(ApiService.class);
// 在业务层调用ApiService的方法
service.getVersionDetail();
1. La retrofit.create(ApiService.class)
actualización vincula la interfaz a Okhttp a través de un proxy dinámico
public <T> T create(final Class<T> service) {
...
return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[] { service },
new InvocationHandler() {
...
ServiceMethod<Object, Object> serviceMethod =
(ServiceMethod<Object, Object>) loadServiceMethod(method);
OkHttpCall<Object> okHttpCall = new OkHttpCall<>(serviceMethod, args);
return serviceMethod.callAdapter.adapt(okHttpCall);
}
});
}
2. Mantener Okhttp internamente, Okhttp completa las solicitudes de red, Retrofit solo es responsable de la producción
3. Devolución de llamada de llamada, que en realidad es la devolución de llamada de Okhttp, correspondiente a la configuración .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
, si no existe dicha configuración, se devolverá el Call<Bean>
objeto
4. El análisis de datos en el método de devolución de llamada de llamada corresponde a la configuración .addConverterFactory(GsonConverterFactory.create())
. También puede ser Jsonfast
una fábrica de conversión de análisis o una fábrica de análisis personalizada. Solo necesita implementar la Retrofit
interfaz de análisis de datos dada. Puede consultar GsonConverterFactory
la implementación
Okhttp
Principio
La capa inferior de OkHttp es enviar solicitudes HTTP o HTTPS y recibir respuestas a través de Java Sockets, pero OkHttp implementa el concepto de agrupación de conexiones, es decir, para múltiples solicitudes desde el mismo host, puede compartir una conexión Socket en lugar de enviar solicitudes HTTP cada vez. Cierre el Socket subyacente para que se realice el concepto de grupo de conexiones. OkHttp encapsula la biblioteca OkIo utilizada para las operaciones de lectura y escritura de Socket.
imagen
Los protagonistas de OkHttp
OkHttpClient
Fábrica de llamadas, que se puede utilizar para enviar peticiones HTTP y leer sus respuestas.
Planta productora, responsable de las llamadas de producción
Solicitud
Solicitud OkHttp, Request.Builder().build
creando y Request.Builder()
configurando información de solicitud, como método de get/post
solicitud RequestBody
, parámetros de solicitud, encabezado de solicitudheader
Llamada
El despachador, Call es la interfaz de nivel superior, y RealCall es responsable de la implementación específica. Responsable Request
y Response
puente voluntad Request
en una execute()
salida lleva a cabo de manera sincrónica Response
, o Request
para enqueue(callback)
añadió de forma asíncrona a la programación.
Despachador (ThreadPoolExecutor)
La agrupación de subprocesos de programación Disptcher logra una alta concurrencia y un bajo bloqueo. Usando Deque como caché, la
tarea de ejecución de orden primero en entrar, primero en salir llama a la función finalizada en try / finalmente para controlar el orden de ejecución de la cola de tareas, en lugar de usar bloqueos, reduciendo la complejidad de codificación y mejorando el rendimiento
. Solo activa el trabajo de programación de Dispatcher.
Respuesta
Respuesta, incluida información como código, mensaje, encabezado, cuerpo, etc.
// 1.创建Client
OkHttpClient client = new OkHttpClient.Builder().build()
// 2.创建Request
Request reuqest = new Request.Builder().get().url(url).builder()
// 3.call execute同步
Response response = client.newCall(request).execute()
// 异步,回调在子线程中执行
client.newCall(request).enqueue(new Callback{
@Override
public void onFailure(Call call, IOException e){
}
@Override
public void onResponse(Call call, Response response){
}
})
Voleo
imagen
RequestQueue
- StringRequest
- JsonRequest
- ImageRequest
Hilo Diapatch
- MainDispatcher
- CacheDispatcher
- NetworkDispatcher
- ImageDispatcher
Obtener interfaz de datos
-
HttpStack
procesa la solicitud Http y devuelve el resultado de la solicitud. Actualmente, Volley tiene HurlStack basado en HttpURLConnection y HttpClientStack basado en Apache HttpClient -
ResponseDelivery (La interfaz de distribución de resultados devueltos, actualmente solo basada en ExecutorDelivery se distribuye en el hilo correspondiente al manejador de parámetros de entrada).
Datos
- Caché (Volley usa DiskBasedCache basado en tarjeta sd por defecto)
- Red (NetworkResponse)
Resumen
Obtenga continuamente solicitudes de RequestQueue a través de dos hilos de envío, llame a uno de los dos tipos de interfaces de adquisición de datos, caché o red, de acuerdo con si se ha almacenado en caché, obtenga los datos solicitados del caché de memoria o servidor, y luego entréguelos a ResponseDelivery para hacer la distribución de resultados y la devolución de llamada Tratar con
AysncHttpClient
Apache HttpClient utiliza la gestión de subprocesos asíncronos para administrar el subproceso de solicitud. El análisis principal no se realizará aquí. . .
Información marco / referencia de documento oficial
Autor: ReeseLuo
enlace: https: //www.jianshu.com/p/7a970db4e7cf
Fuente: libros de Jane
tienen derechos de autor por el autor. Para reproducción comercial, por favor contacte al autor para autorización, y para reproducción no comercial, por favor indique la fuente.