这是我参与「第四届青训营 」笔记创作活动的第14天。
Android程序几乎无时无刻都在和网络资源打交道。那么,Android是如何进行网络请求的呢?让我来学习Android网络请求两个常见的开源框架:OkHttp和Retrofit。
OkHttp
什么是OkHttp
OkHttp一个处理网络请求的开源项目,是安卓端流行的轻量级框架,由移动支付Square公司贡献。
配置文件
在build.gradle文件中编写:
implementation("com.squareup.okhttp3:okhttp:4.9.1")
重新build项目,导入第三方库。
创建Get请求
private fun asyncGet() {
val url = ""
//创建request请求对象
val request = Request.Builder()
//请求路径
.url(url)
//设置get请求方式和请求参数
.method("GET", null)
.build()
//创建call并调用enqueue()方法实现网络请求
OkHttpClient().newCall(request)
.enqueue(object : Callback {
//请求失败回调函数
override fun onFailure(call: Call, e: IOException) {
}
//请求成功回调函数
override fun onResponse(call: Call, response: Response) {
}
})
}
使用enqueue方法发起异步网络请求。
创建Post请求
private fun asyncPost() {
val url = ""
//添加post请求参数
val requestBody = FormBody.Builder()
.add("userName", "name")
.add("passWord", "pass")
.build()
//创建request请求对象
val request = Request.Builder()
.url(url)
.post(requestBody)
.build()
//创建call并调用enqueue()方法实现网络请求
OkHttpClient().newCall(request)
.enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
}
override fun onResponse(call: Call, response: Response) {
}
})
}
使用FormBody.Builder方法定义请求体,在创建request请求对象时可以直接使用post方法,参数为请求体。
设置超时时间和缓存
在大多数情况下,网络请求都为耗时操作,主程序不能一直等待网络请求。我们可以通过配置okHttpClient对象属性来设置超时时间和缓存。
private fun setTimeoutAndCache() {
//缓存目录
val cacheDir=externalCacheDir
//缓存大小
val cacheSize=10*1024*1024L
val okHttpClientBuilder=OkHttpClient.Builder()
.connectTimeout(20,TimeUnit.SECONDS)
.readTimeout(20,TimeUnit.SECONDS)
.writeTimeout(20,TimeUnit.SECONDS)
.cache(Cache(File(cacheDir,"cache.txt"),cacheSize))
val okHttpClient=okHttpClientBuilder.build()
}
Retrofit
什么是Retrofit
Retrofit和okHttp同属于一个公司研发,是对OkHttp的一个封装,具备OkHttp的优点,同时拥有更多的特性:
- restful api设计风格。
- 可以通过注解配置请求,包括请求方法,请求参数,返回值等。
- 使用
Converter可以将获得的数据解析为不同形式的数据。
添加依赖
同样需要在module文件中导入:
dependencies {
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'//可选依赖,解析json字符所用
implementation 'com.squareup.retrofit2:converter-scalars:2.0.0' //解析字符串
}
创建描述网络请求接口
//接口类名:可自定义,尽量和这类请求的含义相关
interface IUserInfoService {
@GET("users/{uid}/name")
fun getUserName(@Path("uid") uid: Int): Call<ResponseBody>
//@GET("users/{name}/uid")
//fun getRequest(@Path("name") name:String)) Call<User>
//后续可以增加其他的接口,一个接口对应一个api请求
}
- @GET注解:说明请求方式并指定访问请求路径
- @Path注解:指定传进来参数的属性,该属性值会替换@GET注解中的路径
发起网络请求
fun getUserName(view: View) {
//创建Retrofit实例
val retrofit = Retrofit.Builder()
.baseUrl("https://www.bytedance.com/")
.build()
//创建iUserInfoService实例
val iUserInfoService = retrofit.create(IUserInfoService::class.java)
//创建网络请求Call对象
val call = iUserInfoService.getUserName(1123)
//发起异步请求
call.enqueue(object : Callback<ResponseBody> {
override fun onResponse(call: Call<ResponseBody>,
response: Response<ResponseBody>) {
//请求成功时回调
request_result_tv.text = "请求成功:" + response.body()!!.string()
}
override fun onFailure(call: Call<ResponseBody>, e: Throwable) {
//请求失败时候的回调
request_result_tv.text = "请求失败:" + e.message
}
})
}
总结
Retrofit和OkHttp的组件是当下Android开发最为流行的网络请求方式,它们的功能更为全面,且使用方便。当然也有其他的一些框架,主要是看业务需要选择使用什么。