Android主流网络框架

作者: ReeseLuo | 来源:发表于2019-02-24 13:00 被阅读0次

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

    原理

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

    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主流网络框架

        本文链接:https://www.haomeiwen.com/subject/oyyvyqtx.html