ZUI易入门Android之Okhttp的相关概念

  1. 什么是okhttp?

okhttp是一个第三方类库,用于android中请求网络。这是一个开源项目,是安卓端最火热的轻量级框架,由移动支付Square公司贡献(该公司还贡献了Picasso和LeakCanary)

  1. 为什么要使用OKHttp

OKHttp是Android版Http客户端。非常高效,支持SPDY、连接池、GZI和HTTP缓存,支持SPDY,可以合并多个到同一个主机的请求。

OkHttp 处理了很多网络疑难杂症:会从很多常用的连接问题中自动恢复。如果您的服务器配置了多个IP地址,当第一个IP连接失败的时候,OkHttp会自动尝试下一个IP。

OkHttp还处理了代理服务器问题和SSL握手失败问题。

  1. 如何使用?

当我们使用一个三方库时,最好就是减少对其API的依赖,所以我们要对原始的OKHttp做二次封装来实现我们的业务需求,如何封装就要对其原理及一些常用的API非常熟悉,下面我们会系统学习网络这一模块,然后封装成符合我们业务的SDK。

  1. 网络请求构建、网络请求发送、网络请求解析

说起网络就要先了解什么是HTTP?

功能:本地持久化数据、定制化的解析器、定制化的构建器、可自由切换网络库

  1. 与Task线程池进行绑定
  2. 申请权限:

Task与线程池

设计Task与线程池是为了更好的维护网络请求的开始、暂停、取消等操作。

比如下面两个场景:

  1. 当用MVP设计代码时,网络请求一般都写在P层里,当打开一个页面,这时候页面退出,网络请求还在继续,不仅造成内存泄漏更有造成空指针的危险,这个时候用自定义的Task可以Activity的生命周期进行绑定,当退出界面可把这个网络任务取消掉。
  2. 当点击一个按钮会发送一次网络请求,当快速点击多次,这时会造成两个一样的网络任务并行,使用自定义的Task,可以判断是否有同一类型的网络请求,根据业务的需要去设计不同的使用场景。

本项目只采取单一的Task处理策略,当存在相同的任务时,新建立的任务会取消掉。

 

如何使用:TaskHelper

okhttp源码解析

OkHttpClient : 建议OkHttp的客户端,初始化OkHttp要使用的配置信息。

Request:请求信息封装

Call:可执行异步或者同步请求

Interceptor:  OkHttp中的精华就是 拦截器,责任链设计模式。

RetryAndFollowUpInterceptor:负责错误重试及重定向。

BridgeInterceptor:负责组装请求及解析数据。

CacheInterceptor:负责读取缓存和更新缓存。

ConnectInterceptor:负责和服务器建立连接。

CallServerInterceptor:负责发送请求及接收数据。Okio 对接

 

  OkHttpClient client = new OkHttpClient(); // okhttp 配置一些默认
        //2、构建请求 1)url 2)参数
        HttpUrl.Builder builder = HttpUrl.parse("https://www.baidu.com").newBuilder();
//        builder.addQueryParameter("sort", "desc");
//        builder.addQueryParameter("page", "1");
//        builder.addQueryParameter("pagesize", "1");
//        builder.addQueryParameter("time", "" + System.currentTimeMillis()/1000);
//        builder.addQueryParameter("key", "bbc57dd5e4f05991aff09eafd2e667e0");
        //3、构建Request
        Request request = new Request.Builder()
                .url(builder.build())
                .get()
                .build(); //建造者设计模式
        //4、构建Call
        Call call = client.newCall(request);
        //5 执行网络请求
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.e("initGetNetData","onFailure" + e);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Log.e("initGetNetData","onResponse" + response.body().string());
            }
        });

 

你可能感兴趣的:(ZUI易入门Android)