1.依赖
implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0'
implementation'com.github.valdio:SerializableCookieJar:1.0.0'
implementation'io.reactivex.rxjava2:rxjava:2.2.4'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
implementation'com.squareup.retrofit2:retrofit:2.5.0'
implementation'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
其中包含
com.squareup.okhttp3:logging-interceptor:3.10.0 okhttp日志拦截器
com.github.valdio:SerializableCookieJar:1.0.0 okhttp cookie管理
com.squareup.retrofit2:adapter-rxjava2:2.3.0' retrofit配合rxjava使用
2.调用类
/**
* author : flexible
* email : lgd19940421@163.com
**/
public class RtfHelper {
private static RtfHelper instance;
private String rtfBaseUrl;
private Boolean DEBUG = false;
private int rtfConnectTimeout = 10;
private int rtfReadTimeout = 15;
private int rtfWriteTimeout = 15;
private Retrofit retrofit;
private RtfHelper() {
}
public static RtfHelper getInstance() {
if (instance == null) {
synchronized (RtfHelper.class) {
if (instance == null) {
instance = new RtfHelper();
}
}
}
return instance;
}
/**
* 初始化
*
* @param baseUrl
*/
public void init(String baseUrl) {
rtfBaseUrl = baseUrl;
SerializableCookieJar cookieJar = new SerializableCookieJar(BaseApp.getAppContext());
OkHttpClient.Builder httpBuilder = new OkHttpClient.Builder()
.hostnameVerifier((s, sslSession) -> true)
.cookieJar(cookieJar)
.connectTimeout(rtfConnectTimeout, TimeUnit.SECONDS)
.readTimeout(rtfReadTimeout, TimeUnit.SECONDS)
.writeTimeout(rtfWriteTimeout, TimeUnit.SECONDS);
if (DEBUG) {
//NONE:没有记录
//BASIC:日志请求类型,URL,请求体的大小,响应状态和响应体的大小
//HEADERS:日志请求和响应头,请求类型,URL,响应状态
//BODY:日志请求和响应标头和正文
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(
message -> Log.i("flexible", message)
);
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
httpBuilder.addInterceptor(loggingInterceptor);
}
OkHttpClient okHttpClient = httpBuilder.build();
retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.client(okHttpClient)
.addConverterFactory(FastJsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
}
/**
* 初始化
*
* @param baseUrl
* @param connectTimeout 连接超时时间
* @param readTimeout 读取超时时间
* @param writeTimeout 写入超时时间
*/
public void init(String baseUrl, int connectTimeout, int readTimeout, int writeTimeout) {
rtfConnectTimeout = connectTimeout;
rtfReadTimeout = readTimeout;
rtfWriteTimeout = writeTimeout;
init(baseUrl);
}
public <T> T getApiService(Class<T> t) {
if (rtfBaseUrl == null) {
throw new RuntimeException("you should init first ");
}
return (T) retrofit.create(t);
}
}
调用之前需要初始化,调用init(),传入retrofit的baseUrl,后序接口会自动拼接baseUrl。
初始化调用方法:
RtfHelper.getInstance().init("");
RtfHelper.getInstance().init("", 10, 10, 10);
初始之后,通过getApiService(Class T)获取调用接口类。该方法会返回传入的类型 ,然后顶用Api内的网络请求即可。
RtfHelper.getInstance().getApiService(ApiService.class).login("","").compose(Transformer.schedule())
.subscribe(new BaseObserver<IBaseModel>() {
@Override
public void doOnSubscribe(Disposable d) {
}
@Override
public void onFail(String errorMsg) {
}
@Override
public void onSuccess(IBaseModel iBaseModel) {
}
@Override
public void onComplete() {
}
});
}
/**
* author : flexible
* email : lgd19940421@163.com
* github: https://github.com/FlexibleXd
**/
public interface ApiService {
@POST("/login")
Observable<IBaseModel> login(@Query("name") String name,
@Query("pwd") String pwd);
}
BaseObserver可自行封装,封装网络请求成功 失败等。配合MVP使用,loading与网络框架拆分。
3.ConverterFactory
对response处理需要ConverterFactory,我使用的是fastjson进行解析。官方是支持gson,可导入以下依赖:
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'