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

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

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. "Failed to fetch URL https://dl-ssl.google.com/android/repos
  2. 浅析Android中的消息机制-解决:Only the original thread that cr
  3. Android异步消息机制之Handler
  4. Android的Handler机制详解3_Looper.looper()不会卡死主线程
  5. Android使用Retrofit进行网络请求
  6. Android(安卓)P SystemUI之StatusBar UI布局status_bar.xml解析
  7. Android之Handler用法总结
  8. android通过ksoap2对webservice的解析
  9. Android:使用OkHttp解析Json遇到的坑

随机推荐

  1. Flutter Android(安卓)打包发布
  2. android post 乱码问题
  3. 【handler】Android定时每十分钟执行一次
  4. android 中对apache httpclient及httpurl
  5. Android清理设备内存具体完整演示样例(一
  6. android拍照,调用系统相册,相片上传
  7. Android api对应版本(持续更新)
  8. Android窗体自定义标题栏
  9. Android之Bluetooth编程
  10. android P-sensor (Proximity Sensor)