一篇搞定okHttp一

本文是OkHttp系列的第一篇,详细介绍了使用OkHttp进行网络请求的四个步骤,包括创建OkHttpClient客户端、Request对象、Call对象以及同步和异步请求的调用。OkHttpClient使用Builder模式构建,Dispatcher作为请求分发器,管理同步和异步请求。Request对象用于设置网络连接参数,Call作为请求桥梁,发起网络请求。OkHttp的同步请求会阻塞线程,而异步请求则不会,适用于Android开发。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

OkHttp系列一、使用OkHttp进行网络请求的4个步骤

我们创建OkHttpClient客户端的方式通常有两种:

方式一、OkHttpClient client = new OkHttpClient();
方式二、OkHttpClient okHttpClient = new OkHttpClient.Builder().build();

上面二者等价,都是创建一个OkHttpClient客户端,其实打开new OkHttpClient()源码我们可以发现,其实OkHttpClient的构造方法里面就是返回一个Builder对象:

public OkHttpClient() {     
    this(new Builder()); 
}

不同的是方式一创建的OkHttpClient客户端不能添加拦截器、超时参数、log日志、头文件、缓存等属性。对于方式二,我们进入到OKHttpClient源码,可以发现Builder是它的一个静态的内部类,通过new OkHttpClient.Builder()我们就可以获取到builder对象,然后Builder静态内部类里面有一个build()方法,他的源码如下:

public OkHttpClient build() {        
    return new OkHttpClient(this);    
}

不难发现,其实方式二就是我们先初始化Builder对象,方便我们后面设置各种请求场景的参数,然后再调用OkHttpClient的带Builder对象的有参构造方法返回一个OkHttpClient客户端。我们点开Builder的源码可以发现,里面初始化了大量的参数:

public Builder() {
    dispatcher = new Dispatcher();
    protocols = DEFAULT_PROTOCOLS;
    connectionSpecs = DEFAULT_CONNECTION_SPECS;
    eventListenerFactory = EventListener.factory(EventListener.NONE);
    proxySelector = ProxySelector.getDefault();
    cookieJar = CookieJar.NO_COOKIES;
    socketFactory = SocketFactory.getDefault();
    hostnameVerifier = OkHostnameVerifier.INSTANCE;
    certificatePinner = CertificatePinner.DEFAULT;
    proxyAuthenticator = Authenticator.NONE;
    authenticator = Authenticator.NONE;
    connectionPool = new ConnectionPool();
    dns = Dns.SYSTEM;
    followSslRedirects = true;
    followRedirects = true;
    retryOnConnectionFailure = true;
    connectTimeout = 10*000;
    readTimeout = 10*000;
    writeTimeout = 10*000;
    pingInterval = 0;
}

Builder 构造方法的第一行的Dispatcher对象在整个OKHttp中都是出于一个最核心的超然地位。毕竟再具体的网络请求实现过程中,会遇到各种需求,情况是十分的复杂,而恰好,Builder完美的具备了我们的需求特性。

而Dispatcher,是一个分发器,接收我们发出的同步或者异步请求队列,然后根据我们所设置的条件进行同步或者异步 请求的分发,具体的作用,我们后面做详细的说明。

至此,我们大致知道了OkHttpClient客户端的创建方式以及不同。

然后我们再来看看另一个关键的对象:Request,它主要是帮助我们初始化一个常用的数据请求要用到的一些参数,比如指定URL网络连接地址,请求方法如get、post等。它还可以添加请求头addHeader等等。他的创建方式如下:

Request request = new Request.Builder().addHeader(key, value).build();

然后,我们再来看看OKHttp请求还需要用到的另一个参数Call:

Call call = client.newCall(mRequest);

Call对象代表一个实际的一个网络请求,他是OkHttpClient客户端和Request对象的纽带和桥梁,他通过newCall方法把二者串联起来。
最后,Call对象再通过同步或异步方法的调用开始网络请求:

同步请求:call.execute();
异步请求:call.enqueue();

总结起来,OKHttp的使用一共分4个步骤:

1、创建OkHttpClient客户端;
2、创建Request对象;
3、创建Call对象,并通过newCall方法把OkHttpClient客户端和Request对象串联起来
4、调用Call的同步或者异步方法发起网络请求:call.execute()、call.enqueue()。

这里的第一步和第二步都用到了Builder建造者模式。
这里需要注意两点:

一是Call是一个接口,具体的方法有他的实现类RealCall来实现。

二是Call发起同步请求:call.execute()后,系统就处于阻塞状态,直到收到响应结果为止(无论结果是成功还是失败),这时候我们不能做其他的任何操作。Call 发起异步请求:call.enqueue()后,系统会开启一个子线程进行网络请求,系统不会被阻塞,我们该干嘛干嘛,想干嘛干嘛。所以Android开发中,我们都是使用异步请求,否则后果不堪设想。
OkHttp用到的设计模式:

单例模式
Builder 建造者模式
工厂模式(Call.Factory)
责任链模式:链式调用、灵活的解耦
策略模式:请求头包含 "If-Modified-Since" 或 "If-None-Match" 暂时不走缓存;
         指定了无缓存,不走缓存;
         指定了缓存,则看缓存过期时间,符合要求走缓存

OkHttp系列二、使用OkHttp进行同步/异步网络请求

简要请求的代码如下:

Request mRequest = new Request.Builde
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_深巷的猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值