Retrofit 简介
Retrofit 是 Square 公司基于 Restful 风格推出的网络框架封装。
Retrofit 与 OKHttp 的关系:Retrofit 是基于 OKHttp 的网络请求框架的二次封装,其本质仍是 OkHttp。
常见网络库的对比:
- AndroidAsynHttp:基于 HttpClient,作者已停止维护,Android 5.0 不再使用 HttpClient,因此不推荐使用。
- Volley:基于 HttpUrlConnection,Google 官方推出,只适合轻量级网络交互,不适合大文件上传下载场景。
- Retrofit:API 设计简单易用,注解化配置高度解耦,支持多种解析器,支持 RxJava。
使用步骤
1. 依赖包导入
dependencies {
...
implementation 'com.squareup.retrofit2:retrofit:2.6.2'
implementation 'com.squareup.okhttp3:okhttp:4.2.2'
implementation 'com.squareup.retrofit2:converter-gson:2.6.2'
}
2. 网络权限
网络权限:
<uses-permission android:name="android.permission.INTERNET" />
3. 创建接口设置请求类型与参数
public interface UserMgrService {
@GET("login)
public Call<UserInfoModel> login(@Query("username") String username, @Query("pwd") String pwd);
}
常用参数注解:
- @GET、@POST:确定请求方式
- @Path:请求 URL 的字符替代
- @Query:要传递的参数
- @QueryMap:包含多个 @Query 注解参数
- @Body:添加实体类对象
- @FormUrlEncoded:URL 编码
4. 创建 Retrofit 对象设置数据解析器
Retrofit retrofit = new Retrofit.Builder().baseUrl(Constants.BASE_URL).addConverterFactory(GsonConverterFactory.create()).build();
常用数据解析器:
- Gson:
implementation 'com.squareup.retrofit2:converter-gson:(insert latest version)'
- Jackson:
implementation 'com.squareup.retrofit2:converter-jackson:(insert latest version)'
- Simple XML:
implementation 'com.squareup.retrofit2:converter-simplexml:(insert latest version)'
- Protobuf:
implementation 'com.squareup.retrofit2:converter-protobuf:(insert latest version)'
- Moshi:
implementation 'com.squareup.retrofit2:converter-moshi:(insert latest version)'
- Wire:
implementation 'com.squareup.retrofit2:converter-wire:(insert latest version)'
- Scalars:
implementation 'com.squareup.retrofit2:converter-scalars:(insert latest version)'
5. 生成接口调用接口方法
// 生成接口对象
UserMgrService service = retrofit.create(UserMgrService.class);
// 调用接口方法返回 Call 对象
Call<UserInfoModel> call = service.login("zhangsan", "123456");
6. 返送请求处理返回数据
发送请求(同步/异步):
- 同步:调用 Call 对象的 execute(),返回结果的响应体。
- 异步:调用 Call 对象的 enqueue(),参数是一个回调。
案例
介绍如何使用Retrofit实现用户登录。
interface UserMgrService {
@GET("user")
fun login(@Query("username") username: String, @Query("pwd") pwd: String): Call<UserInfoModel>
}
// 1. 创建 Retrofit 对象
val retrofit = Retrofit.Builder().baseUrl("").addConverterFactory(GsonConverterFactory.create()).build()
// 2. 获取 UserMgrService 对象
val service = retrofit.create(UserMgrService::class.java)
// 3. 调用登录方法
val call = service.login("zhangsan", "123456")
// 4. 发送请求
// 同步方式发送请求
val response = call.execute() // 注意,不能直接在主线程中执行网络请求,否则会报 NetworkOnMainThreadException 异常(Android 4.0 后强制抛出的异常)。可新建线程去执行网络请求
// 异步方式发送请求
call.enqueue(object : Callback<UserInfoModel> {
override fun onFailure(call: Call<UserInfoModel>, t: Throwable) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun onResponse(call: Call<UserInfoModel>, response: Response<UserInfoModel>) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
})
总结
- Retrofit 是基于 OkHttp 网络库的高级封装
- 采用注解,网络请求参数配置更灵活,扩展性更好
- Restful 风格的 API 优先选用 Retrofit
网友评论