本文仅仅是从使用的角度,对使用Retrofit进行网络请求的自我总结
1、依赖的添加:
// Retrofit库
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
// gson解析,可以自行替换
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
// 日志的拦截器,也可以自行选择
implementation 'com.squareup.okhttp3:logging-interceptor:3.6.0'
2、对Retrofit进行初始化
initRetrofit();
2.1 Retrofit mRetrofit = new Retrofit.builder() .build()
/**
* 初始化Retrofit
*/
public AllApi initRetrofit() {
if (allApi == null) {
Retrofit mRetrofit = new Retrofit.Builder()
.client(MyApp.initOKHttp())
// 设置请求的域名
.baseUrl(ApiAddress.API)
// 设置解析转换工厂,用自己定义的
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
allApi = mRetrofit.create(AllApi.class);
}
return allApi;
}
其中首先使用:Retrofit mRetrofit = new Retrofit.builder() .build() 新建Retrofit对象,其次在创建Retrofit对象的中间使用链式结构进行各种属性的创建
.client(MyApp.initOKHttp()) 其中添加httpclient,httpclient可进行全局变量的设置
// 设置请求的域名
.baseUrl(ApiAddress.API)
// 设置解析转换工厂,用自己定义的
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
全局httpclient设置如下:
/**
* 全局httpclient
*/
public static OkHttpClient initOKHttp() {
if (mOkHttpClient == null) {
mOkHttpClient = new OkHttpClient.Builder()
//设置连接超时时间
.connectTimeout(TIMEOUT, TimeUnit.SECONDS)
//设置读取超时时间
.readTimeout(TIMEOUT, TimeUnit.SECONDS)
//设置写入超时时间
.writeTimeout(TIMEOUT, TimeUnit.SECONDS)
//添加日志拦截器
.addInterceptor(InterceptorUtil.LogInterceptor())
//cookie
.addInterceptor(new SessionIdInterceptor())
.build();
}
return mOkHttpClient;
}
.addConverterFactory(GsonConverterFactory.create()) 的作用是将得到的数据解析成所需要的对象或集合,增强了数据的保密性,但是个人认为对于调试时获取服务端的原始数据进行分析时,会显得有点麻烦,添加日志拦截器以后可以解决这样的问题
2.2 、mRetrofit.create(AllApi.class);
其中传入的参数为接口类
3、创建接口类:
顾名思义,其中放入的是自己使用时需要调取的各种接口地址及接口方法;
Retrofit通过注解对请求方法、参数、地址等进行处理,从而进行调用;
@GET("users/list")
@POST(ApiAddress.USER_LOGIN)
传参:
get方法:通过Query、QueryMap
我们传入参数,就可以访问各种数据
post方法:通过@Body传递参数(除了表单类型外都可以使用@Body注解请求体)
注:注解的方式有多种多样,此为个人使用的一种方式
4、调用及数据的回调
Call<ResponseBody> repos = RetrofitUtil.getInstance().initRetrofit().getDeptList(map);
repos.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
//处理数据,然后在UI线程中更新数据
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
}
});
回调后的数据处理等在此省略
5、Retrofit的单例模式封装
/**
* 单例封装
*
* @return
*/
public static RetrofitUtil getInstance() {
if (mInstance == null) {
synchronized (RetrofitUtil.class) {
if (mInstance == null) {
mInstance = new RetrofitUtil();
}
}
}
return mInstance;
}
至此,Retrofit的基本用法完结,
此为个人对Retrofit网络请求的基本梳理,如有不足及错误望请指正,在此感谢。