.addConverterFactory(GsonConverterFactory.create())
.baseUrl(ApiConfig.base_URL)
.build();
}
private static class SingletonHolder{
private static final RetrofitServiceManager INSTANCE = new RetrofitServiceManager();
}
public T create(Class service){
return mRetrofit.create(service);
}
}
说明:创建了一个RetrofitServiceManager类,该类采用单例模式,在私有的构造方法中,生成了Retrofit 实例,并配置了OkHttpClient和一些公共配置。提供了一个create()方法,生成接口实例,接收Class范型,因此项目中所有的接口实例Service都可以用这个来生成,代码如下:
mMovieService = RetrofitServiceManager.getInstance().create(MovieService.class);
通过create()方法生成了一个MovieService
二,创建接口,通过第一步获取实例上面已经有了可以获取接口实例的方法因此我们需要创建一个接口,代码如下:
public interface MovieService{
//获取豆瓣Top250 榜单
@GET(“top250”)
Observable getTop250(@Query(“start”) int start, @Query(“count”)int count);
@FormUrlEncoded
@POST("/x3/weather")
Call getWeather(@Field(“cityId”) String cityId, @Field(“key”) String key);
}
好了,有了接口我们就可以获取到接口实例了mMovieService
三,创建一个业务Loader ,如XXXLoder,获取Observable并处理相关业务解释一下为什么会出现Loader ,我看其他相关文章说,每一个Api 都写一个接口,我觉得这样很麻烦,因此就把请求逻辑封装在在一个业务Loader 里面,一个Loader里面可以处理多个Api 接口。代码如下:
public Observable getWeatherList(String cityId,String key){ 《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》 【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享 return observe(mMovieService.getWeather(cityId,key)) public interface MovieService{ @FormUrlEncoded 创建一个MovieLoader,构造方法中生成了mMovieService,而Service 中可以定义和业务相关的多个api,比如:例子中的MovieService中, 上面的代码中,MovieLoader是从ObjectLoader 中继承下来的,ObjectLoader 提取了一些公共的操作。代码如下: 相当于一个公共方法,其实也可以放在一个工具类里面,后面做缓存的时候会用到这个父类,所以就把这个方法放到父类里面。 创建Loader实例 mMovieLoader = new MovieLoader(); 通过Loader 调用方法获取结果,代码如下: 以上就完成请求过程的封装,现在添加一个新的请求,只需要添加一个业务Loader 类,然后通过Loader调用方法获取结果就行了,是不是方便了很多?但是在实际项目中这样是不够的,还能做进一步简化。 1,统一处理请求结果 现实项目中,所有接口的返回结果都是同一格式,如: { 我们在请求api 接口的时候,只关心我们想要的数据,也就上面的data,其他的东西我们不太关心,请求失败的时候可以根据status判断进行错误处理,所以我们需要包装一下。首先需要根据服务端定义的JSON 结构创建一个baseResponse 类,代码如下: 有了统一的格式数据后,我们需要剥离出data 返回给上层调用者,创建一个PayLoad 类,代码如下: PayLoad 继承自Func1,接收一个baseResponse , 就是接口返回的JSON数据结构,返回的是T,就是data,判断是否请求成功,请求成功返回Data,请求失败包装成一个Fault 返回给上层统一处理错误。在Loader类里面获取结果后,通过map 操作符剥离数据。代码如下: public Observable 2,统一处理错误 在PayLoad 类里面,请求失败时,抛出了一个Fault 异常给上层,我在Activity/Fragment 中拿到这个异常,然后判断错误码,进行异常处理。在onError () 中添加代码如下: public void call(Throwable throwable) { 以上就可以对应错误码处理相应的错误了。 在实际项目中,每个接口都有一些基本的相同的参数,我们称之为公共参数,比如:userId、userToken、userName,deviceId等等,我们不必要,每个接口都去写,这样就太麻烦了,因此我们可以写一个拦截器,在拦截器里面拦截请求,为每个请求都添加相同的公共参数。拦截器代码如下:
public Observable getMovie(int start, int count){
return observe(mMovieService.getTop250(start,count))
.map(new Func1
@Override
public List call(MovieSubject movieSubject) {
return movieSubject.subjects;
}
});
}
.map(new Func1
@Override
public String call(String s) {
//可以处理对应的逻辑后在返回
return s;
}
});
}
//获取豆瓣Top250 榜单
@GET(“top250”)
Observable getTop250(@Query(“start”) int start, @Query(“count”)int count);
@POST("/x3/weather")
Call getWeather(@Field(“cityId”) String cityId, @Field(“key”) String key);
}
}
可以定义和电影相关的多个api,获取电影列表、获取电影详情、搜索电影等api,就不用定义多个接口了。
protected Observable observe(Observable observable){
return observable
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
}
private void getMovieList(){
mMovieLoader.getMovie(0,10).subscribe(new Action1() {
@Override
public void call(List movies) {
mMovieAdapter.setMovies(movies);
mMovieAdapter.notifyDataSetChanged();
}
}, new Action1() {
@Override
public void call(Throwable throwable) {
Log.e(“TAG”,“error message:”+throwable.getMessage());
}
});
}
“status”: 200,
“message”: “成功”,
“data”: {}
}
public class baseResponse {
public int status;
public String message;
public T data;
public boolean isSuccess(){
return status == 200;
}
}
public class PayLoad implements Func1
@Override
public T call(baseResponse tbaseResponse) {//获取数据失败时,包装一个Fault 抛给上层处理错误
if(!tbaseResponse.isSuccess()){
throw new Fault(tbaseResponse.status,tbaseResponse.message);
}
return tbaseResponse.data;
}
}
getMovie(int start, int count){
return observe(mMovieService.getTop250(start,count))
.map(new PayLoad
}
Log.e(“TAG”,“error message:”+throwable.getMessage());
if(throwable instanceof Fault){
Fault fault = (Fault) throwable;
if(fault.getErrorCode() == 404){
//错误处理
}else if(fault.getErrorCode() == 500){
//错误处理
}else if(fault.getErrorCode() == 501){
//错误处理
}
}
}
public class HttpCommonInterceptor implements Interceptor {
private Map
public HttpCommonInterceptor() {
}
@Override



