前言
项目中用到了retrofit框架,retrofit在项目中框架的作用非常重要,所以想总结一下,方便以后自己搭框架时,能有更好的使用。
类结构
- 其中Api类是对外提供统一访问接口,其亦是单例类
public class Api {
private String baseUrl = "https://api.littleox.com/";//替换自己项目服务器端的地址
private volatile static ApiService apiService;
public static ApiService getApiService(){//这里采用了单例模式,双检查锁
if(apiService == null){
synchronized (Api.class){
if(apiService == null){
new Api();
}
}
}
return apiService;
}
private Api(){
BaseApi baseApi = new BaseApi();
apiService = baseApi.getRetrofit(baseUrl).create(ApiService.class);
// retrofit是通过反射机制来实例化对象。最终我们获取的是一个代理实现对象
}
}
- BaseApi类用来封装http请求的熟悉,比如超时、缓存、日志等。
/**
* 网络对象层
*/
public class BaseApi {
/**
* 使用OkHttp配置了超时及缓存策略的Retrofit
*
* @param baseUrl
* @return retrofit
*/
public Retrofit getRetrofit(String baseUrl) {
HttpLoggingInterceptor logInterceptor = new HttpLoggingInterceptor();
if (BuildConfig.DEBUG) {
logInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
} else {
logInterceptor.setLevel(HttpLoggingInterceptor.Level.NONE);
}
//缓存
File cacheFile = new File(CmApplication.context().getCacheDir(), "cache");
Cache cache = new Cache(cacheFile, 1024 * 1024 * 100); //100Mb
//创建一个OkHttpClient并设置超时时间
OkHttpClient client = new OkHttpClient.Builder()
.readTimeout(READ_TIME_OUT, TimeUnit.SECONDS)
.writeTimeout(READ_TIME_OUT, TimeUnit.SECONDS)
.connectTimeout(CONNECT_TIME_OUT, TimeUnit.SECONDS)
.addInterceptor(logInterceptor)
.cache(cache)
.build();
Retrofit retrofit = new Retrofit.Builder()
.client(client)
.baseUrl(baseUrl)
.addConverterFactory(ScalarsConverterFactory.create())//请求结果转换为基本类型,一般为String
.addConverterFactory(GsonConverterFactory.create())//请求的结果转为实体类
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())//适配RxJava2.0,
// RxJava1.x则为RxJavaCallAdapterFactory.create()
.build();
return retrofit;
}
}
- ApiService定义了请求服务器的接口,和请求参数。由于目前主流的参数请求格式为json,所以上面的Retrofit转换工具为Gson,这样服务器发送过来的json字符数据就可以很好的转化为JAVA对象。发送到服务器的数据要进行转化,请求数据我们在项目中都是Java Bean对象,这些对象要转化为RequestBody对象:
public static RequestBody createRequestBody(Map<String, String> params) {
// params 的Map对象最好是 Map<String, Object>,因为我在项目中,服务器其中一些参数要求int型
return RequestBody.create(MediaType.parse("Content-Type, application/json"),
new JSONObject(params).toString());
}
public interface ApiService {
/**
* 登录这里模拟表单数据提交,具体后台可以根据不同的方式去访问:POST GET DELETE HEAD PUT
*/
@POST("login")
Observable<LoginBean> login(@Body RequestBody body);
}
结语
整个结构是Api是外部调用服务的总接口,ApiService提供全部服务。他们是一对多的关系。
当我们要添加新的服务器接口时,直接在ApiService中添加。调用端直接调用方法。这样我们添加方法时对其他地方没有影响,不必修改代码。
retrofit是通过反射机制来实现代理对象的生成。
接口返回的对象是Observable对象,是RXJava的范畴,这样我们就跟响应式编程联系在一起。