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)}

原理

Android--Android主流网络框架_第1张图片

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 serviceMethod =                (ServiceMethod) loadServiceMethod(method);            OkHttpCall okHttpCall = new OkHttpCall<>(serviceMethod, args);            return serviceMethod.callAdapter.adapt(okHttpCall);          }        });}   

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库进行了一层封装。

Android--Android主流网络框架_第2张图片

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负责。负责RequestResponse的桥梁作用,将Requestexecute()同步的方式执行输出Response, 或将Requestenqueue(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

Android--Android主流网络框架_第3张图片

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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

更多相关文章

  1. Android的线程使用来更新UI------Thread Handler Looper TimerTa
  2. Android中的接口回调
  3. Android System Property分析(1):property接口
  4. 用.Net打造一个移动客户端(Android/IOS)的服务端框架NHM(四)——Andr
  5. Android视频框架 Vitamio 打造自己的万能播放器
  6. Android数据库ORMlite框架翻译系列
  7. Android线程与ANR

随机推荐

  1. android 命令
  2. android Intent的一些用法
  3. Android:Fragment
  4. 搜藏夹
  5. Android(安卓)ViewPager实现图片滑动预览
  6. Android中的帧动画
  7. android 添加文本内容到sqlite表中
  8. android开发 权限大全
  9. Android连接网络打印机,jSocket连接网络打
  10. Android(安卓)点击查看大图(长按保存图片)