Android 在6.0之后也将内部的HttpUrlConnection的默认实现替换成了OkHttp
1. 特点
- 1.同时支持HTTP1.1与支持HTTP2.0;
- 2.同时支持同步与异步请求;
- 3.同时具备HTTP与WebSocket功能;
- 4.拥有自动维护的socket连接池,减少握手次数;
- 5.拥有队列线程池,轻松写并发;
- 6.拥有Interceptors(拦截器),轻松处理请求与响应额外需求(例:请求失败重试、响应内容重定向等等);
图片和部分文字转载自https://www.songyubao.com/book/primary/network/OKHttp.html
2.准备阶段
step1:添加网络访问权限
在AndroidManifest.xml中添加
<uses-permission android:name="android.permission.INTERNET" />
step2:添加依赖
在app/build.gradle
的dependencies
中添加下面的依赖
implementation("com.squareup.okhttp3:okhttp:4.9.0")
// 网络请求日志打印
implementation("com.squareup.okhttp3:logging-interceptor:4.9.0")
step3:初始化
val client:OkHttpClient = OkHttpClient.Builder() //builder构造者设计模式
.connectTimeout(10, TimeUnit.SECONDS) //连接超时时间
.readTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS) //写超时,也就是请求超时
.build()
Tips:
1.object对象的方法调用不用实例化,class对象的方法调用需要实例化
object对象在APP整个生命周期只有一份
3. GET请求
Android 分为主线程
和 子线程
主线程
:APP一启动后,Android framework层会启动一个线程,主线程(UI线程)
子线程
例如 new Thread().start()
3.1同步GET请求
-
同步GET的意思是一直等待http请求, 直到返回了响应. 在这之间会阻塞线程, 所以同步请求不能在Android的主线程中执行, 否则会报错NetworkMainThreadException.
-
发送同步
GET
请求很简单:
- 创建
OkHttpClient
实例client
- 通过
Request.Builder
构建一个Request
请求实例request
- 通过
client.newCall(request)
创建一个Call
的实例 Call
的实例调用execute
方法发送同步请求- 请求返回的
response
转换为String
类型返回
object FirstOKHttp{
val client:OkHttpClient = OkHttpClient.Builder() //builder构造者设计模式
.connectTimeout(10 , TimeUnit.SECONDS) //连接超时时间
.readTimeout(10 , TimeUnit.SECONDS) //读取超时
.writeTimeout(10 , TimeUnit.SECONDS) //写超时
.build()
//同步请求
fun get(url : String){
//子线程 为了不让等待响应时影响整个app 一般放在子线程里执行
Thread(Runnable {
//构建请求体
val request:Request = Request.Builder().url(url).build()
//构造请求对象
val call: Call = client.newCall(request)
//发起同步请求execute——同步执行
val response = call.execute()
//execute执行完后
val body = response.body?.string()
Log.e("OkHttp","get response ${
body}")
}).start()
}
}
3.2异步请求
//异步请求 能够在主线程
fun getAsync(url : String){
//构建请求体
val request:Request = Request.Builder().url(url).build()
//构造请求对象
val call: Call = client.newCall(request)
//发起异步请求enqueue——异步执行无返回值
call.enqueue(object :Callback