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 接口。代码如下:
/*
*
- Created by zhouwei on 16/11/10.
/
public class MovieLoader extends ObjectLoader {
private MovieService mMovieService;
public MovieLoader(){
mMovieService = RetrofitServiceManager.getInstance().create(MovieService.class);
}
/* - 获取电影列表
- @param start
- @param count
- @return
*/
public Observable<List> getMovie(int start, int count){
return observe(mMovieService.getTop250(start,count))
.map(new Func1<MovieSubject, List>() {
@Override
public List call(MovieSubject movieSubject) {
return movieSubject.subjects;
}
});
}
public Observable getWeatherList(String cityId,String key){
return observe(mMovieService.getWeather(cityId,key))
.map(new Func1<String, String>() {
@Override
public String call(String s) {
//可以处理对应的逻辑后在返回
return s;
}
});
}
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);
}
}
创建一个MovieLoader,构造方法中生成了mMovieService,而Service 中可以定义和业务相关的多个api,比如:例子中的MovieService中,
可以定义和电影相关的多个api,获取电影列表、获取电影详情、搜索电影等api,就不用定义多个接口了。
上面的代码中,MovieLoader是从ObjectLoader 中继承下来的,ObjectLoader 提取了一些公共的操作。代码如下:
/**
*
- 将一些重复的操作提出来,放到父类以免Loader 里每个接口都有重复代码
- Created by zhouwei on 16/11/10.
/
public class ObjectLoader {
/*
*
- @param observable
- @param
- @return
*/
protected Observable observe(Observable observable){
return observable
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
}
相当于一个公共方法,其实也可以放在一个工具类里面,后面做缓存的时候会用到这个父类,所以就把这个方法放到父类里面。
四,Activity/Fragment 中的调用
创建Loader实例
mMovieLoader = new MovieLoader();
通过Loader 调用方法获取结果,代码如下:
/*
*
- 获取电影列表
*/
private void getMovieList(){
mMovieLoader.getMovie(0,10).subscribe(new Action1<List>() {
@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());
}
});
}
以上就完成请求过程的封装,现在添加一个新的请求,只需要添加一个业务Loader 类,然后通过Loader调用方法获取结果就行了,是不是方便了很多?但是在实际项目中这样是不够的,还能做进一步简化。
五,统一处理结果和错误
1,统一处理请求结果
现实项目中,所有接口的返回结果都是同一格式,如:
{
“status”: 200,
“message”: “成功”,
“data”: {}
}
我们在请求api 接口的时候,只关心我们想要的数据,也就上面的data,其他的东西我们不太关心,请求失败的时候可以根据status判断进行错误处理,所以我们需要包装一下。首先需要根据服务端定义的JSON 结构创建一个BaseResponse 类,代码如下:
/*
*
*
- 网络请求结果 基类
- Created by zhouwei on 16/11/10.
*/
public class BaseResponse {
public int status;
public String message;
public T data;
public boolean isSuccess(){
return status == 200;
}
}
有了统一的格式数据后,我们需要剥离出data 返回给上层调用者,创建一个PayLoad 类,代码如下:
/*
*
*
- 剥离 最终数据
- Created by zhouwei on 16/11/10.
*/
public class PayLoad implements Func1<BaseResponse,T>{
@Override
public T call(BaseResponse tBaseResponse) {//获取数据失败时,包装一个Fault 抛给上层处理错误
if(!tBaseResponse.isSuccess()){
throw new Fault(tBaseResponse.status,tBaseResponse.message);
}
return tBaseResponse.data;
}
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
由于篇幅原因,这份面试宝典已经被整理成了PDF文档,有需要Android面试宝典全套完整文档的麻烦点赞+点击GitHub即可获取资料免费领取方式!
本文在开源项目:GitHub中已收录,里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…
[外链图片转存中…(img-H2J0S0xG-1710847627995)]
本文在开源项目:GitHub中已收录,里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…