Android--Android主流网络框架
Android发展到目前,网络框架推陈出新,目前主要有四大成熟的框架,本文简要分析各大框架的实现原理。具体的用法可参考文中给出的链接。
Android主流框架
Retrofit
Okhttp
Volley
AsyncHttpClient
Retrofit
特点
- 动态代理
- 适配转换Call对象
- 函数解析、网络请求和数据转换
接口
public interface ApiService{ // 与Rxjava结合使用 @POST(NetUrl.HOME_URL) public Obserable> getHomeList(@BODY BodyRequest body); @GET(NetUrl.VERSION_URL) public Obserable> getVersionDetail(); // 没有添加Call回调处理,直接返回Okhttp的Call @Get(NetUrl.USER_URL) public Call> getUser(@Query("uid") long uid)}
原理
image
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.Retrofit通过动态代理,retrofit.create(ApiService.class)
将接口与Okhttp绑定
public T create(final Class service) {... return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[] { service }, new InvocationHandler() { ... ServiceMethod
2.内部维护Okhttp,网络请求由Okhttp完成,Retrofit只负责生产工作
3.Call回调, 实际上就是Okhttp的Call回调,对应配置.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
,若没有此配置,将返回Call
对象
4.Call回调方法中的数据解析,对应配置.addConverterFactory(GsonConverterFactory.create())
, 也可以是Jsonfast
的解析转换工厂或自定以的解析工厂,只需实现Retrofit
给出的数据解析接口,可参考GsonConverterFactory
的实现
Okhttp
原理
OkHttp的底层是通过Java的Socket发送HTTP或HTTPS请求与接受响应,但是OkHttp实现了连接池的概念,即对于同一主机的多个请求,其实可以公用一个Socket连接,而不是每次发送完HTTP请求就关闭底层的Socket,这样就实现了连接池的概念。而OkHttp对Socket的读写操作使用的OkIo库进行了一层封装。
image
OkHttp的主角们
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.创建ClientOkHttpClient client = new OkHttpClient.Builder().build()// 2.创建RequestRequest 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
image
RequestQueue
- 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 异步请求,利用线程池来管理请求线程,这里不做主要分析了。。。
框架资料/官方文档参考
Retrofit
Okhttp
Volley源码 Volley分析
AsyncHttpClient
作者:ReeseLuo
链接:https://www.jianshu.com/p/7a970db4e7cf
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
更多相关文章
- "Failed to fetch URL https://dl-ssl.google.com/android/repos
- 浅析Android中的消息机制-解决:Only the original thread that cr
- Android异步消息机制之Handler
- Android的Handler机制详解3_Looper.looper()不会卡死主线程
- Android使用Retrofit进行网络请求
- Android(安卓)P SystemUI之StatusBar UI布局status_bar.xml解析
- Android之Handler用法总结
- android通过ksoap2对webservice的解析
- Android:使用OkHttp解析Json遇到的坑