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 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.创建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

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

你可能感兴趣的:(Android主流网络框架)