Android发展到目前,网络框架推陈出新,目前主要有四大成熟的框架,本文简要分析各大框架的实现原理。具体的用法可参考文中给出的链接。
Android主流框架
Retrofit
Okhttp
Volley
AsyncHttpClient
Retrofit
特点
- 动态代理
- 适配转换Call对象
- 函数解析、网络请求和数据转换
接口
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)
}
原理
imageRetrofit 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.Retrofit通过动态代理,retrofit.create(ApiService.class)
将接口与Okhttp绑定
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.内部维护Okhttp,网络请求由Okhttp完成,Retrofit只负责生产工作
3.Call回调, 实际上就是Okhttp的Call回调,对应配置.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
,若没有此配置,将返回Call<Bean>
对象
4.Call回调方法中的数据解析,对应配置.addConverterFactory(GsonConverterFactory.create())
, 也可以是Jsonfast
的解析转换工厂或自定以的解析工厂,只需实现Retrofit
给出的数据解析接口,可参考GsonConverterFactory
的实现
Okhttp
原理
OkHttp的底层是通过Java的Socket发送HTTP或HTTPS请求与接受响应,但是OkHttp实现了连接池的概念,即对于同一主机的多个请求,其实可以公用一个Socket连接,而不是每次发送完HTTP请求就关闭底层的Socket,这样就实现了连接池的概念。而OkHttp对Socket的读写操作使用的OkIo库进行了一层封装。
imageOkHttp的主角们
OkHttpClient
Factory for calls, which can be used to send HTTP requests and read their responses.
工厂生产者,负责生产calls
Request
OkHttp的请求,通过Request.Builder().build
创建, Request.Builder()
配置请求信息,如请求方式get/post
等、请求参数RequestBody
、请求头header
Call
调度者,Call作顶级接口,具体实现由RealCall负责。负责Request
和Response
的桥梁作用,将Request
以execute()
同步的方式执行输出Response
, 或将Request
以enqueue(callback)
异步的方式加入调度。
Dispatcher(ThreadPoolExecutor)
调度线程池Disptcher实现了高并发,低阻塞的实现。采用Deque作为缓存,先进先出的顺序执行
任务在try/finally中调用了finished函数,控制任务队列的执行顺序,而不是采用锁,减少了编码复杂性提高性能
只有当Call以异步请求的方式,才触发Dispatcher的调度工作。
Response
响应,包括code、message、header、body等信息
// 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){
}
})
Volley
imageRequestQueue
- StringRequest
- JsonRequest
- ImageRequest
Diapatch Thread
- MainDispatcher
- CacheDispatcher
- NetworkDispatcher
- ImageDispatcher
Get Data Interface
-
HttpStack
处理 Http 请求,返回请求结果。目前 Volley 中有基于 HttpURLConnection 的HurlStack和 基于 Apache HttpClient 的HttpClientStack -
ResponseDelivery(返回结果分发接口,目前只有基于ExecutorDelivery的在入参 handler 对应线程内进行分发。)
Data
- Cache(Volley 默认使用的是基于 sdcard 的DiskBasedCache)
- Network(NetworkResponse)
总结
通过两种Dispatch Thread不断从RequestQueue中取出请求,根据是否已缓存调用Cache或Network这两类数据获取接口之一,从内存缓存或是服务器取得请求的数据,然后交由ResponseDelivery去做结果分发及回调处理。
AysncHttpClient
Apache HttpClient 异步请求,利用线程池来管理请求线程,这里不做主要分析了。。。
网友评论