Retrofit+RxJava+OkHttp是目前使用最多的网络请求框架,功能强大,在之前的项目中也有使用,所以特意做个总结。
首先对这三者之间的关系进行理解,其实在使用过程当中我们没有看到okhttp3包括在后面的工程引用里也并没有它,但是这个组合里为什么会有它,原因在于Retrofit的底层默认是基于okhttp3实现的,所以它们的关系可以概括为:Retrofit负责请求的数据和请求结果,使用接口的的方式呈现出来,OkHttp负责请求的过程,Rxjava负责异步,各种线程之间的切换。
基本操作
1.工程引用
implementation 'com.google.code.gson:gson:2.8.2' //gson解析
implementation 'com.squareup.retrofit2:retrofit:2.0.2' //retrofit2.0
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0' //配合Rxjava 使用
implementation 'com.squareup.retrofit2:converter-gson:2.0.0-beta4' //ConverterFactory的Gson:
implementation 'io.reactivex.rxjava2:rxjava:2.1.8' //rxjava
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1' //rxandroid 线程调度
2.创建接口
- 测试的接口:https://api.douban.com/v2/movie/
我先用Postman跑了一遍,测试一下接口和参数以及得到后面的返回结果。
Postman的使用教程:https://blog.csdn.net/fxbin123/article/details/80428216
开始创建接口:
public interface HttpService {
@GET("top250")
Observable<MovieBean>getTop(@Query("start") int start,@Query("count") int count);
@FormUrlEncoded
@POST("top250")
Observable<MovieBean>getTop1(@Query("start")int start,@Query("count")int count);
}
定义了一个方法 getTop,使用 get请求方式,加上@GET 标签,标签后面是这个接口的 尾址top250,完整的地址应该是 baseUrl+尾址 ,参数 使用@Query标签,如果参数多的话可以用@QueryMap标签,接收一个Map。
而在使用Post方式时,更改方法定义的标签,用@Post标签,参数标签用 @Field 或者 @Body 或者 FieldMap。
注意: 看到很多文章都说在使用Post方法时必须要加上 @FormUrlEncoded标签,但实际上经我测试,如果参数标签是@Field 或者 FieldMap时才需要加上 @FormUrlEncoded标签。
3.创建一个Retrofit 实例,并且完成相关的配置:
private static HttpService httpService;
private static String baseUrl="https://api.douban.com/v2/movie/"; //获取豆瓣电影排行榜的接口
public static HttpService getServer(){
if (httpService==null){
synchronized (HttpManage.class){
if (httpService==null){
Retrofit retrofit=new Retrofit.Builder() //创建Retrofit的实例
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create()) //请求结果转换成实体类
.addCallAdapterFactory(RxJava2CallAdapterFactory.create()) //适配Rxjava
.build();
httpService=retrofit.create(HttpService.class); //获得接口的实例
}
}
}
return httpService;
}
4.发出请求
在Activity或Fragment中发出请求
public void getTop250(){
HttpManage.getServer().getTop1(0,10)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<MovieBean>() {
@Override
public void onSubscribe(Disposable d) {
Log.e(TAG,"onSubscribe");
}
@Override
public void onNext(MovieBean movieBean) {
Log.e(TAG,"请求成功");
List<MovieBean.SubjectsBean>list=movieBean.getSubjects();
for (MovieBean.SubjectsBean subjectsBean:list){
Log.e(TAG,"电影排名:"+subjectsBean.getTitle());
}
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
运行结果:
10-17 14:23:18.473 5523-5523/example.com.retrofitrxdemo E/MainActivity: 请求成功
10-17 14:23:18.473 5523-5523/example.com.retrofitrxdemo E/MainActivity: 电影排名:肖申克的救赎
10-17 14:23:18.473 5523-5523/example.com.retrofitrxdemo E/MainActivity: 电影排名:霸王别姬
10-17 14:23:18.473 5523-5523/example.com.retrofitrxdemo E/MainActivity: 电影排名:这个杀手不太冷
10-17 14:23:18.473 5523-5523/example.com.retrofitrxdemo E/MainActivity: 电影排名:阿甘正传
10-17 14:23:18.473 5523-5523/example.com.retrofitrxdemo E/MainActivity: 电影排名:美丽人生
10-17 14:23:18.473 5523-5523/example.com.retrofitrxdemo E/MainActivity: 电影排名:泰坦尼克号
10-17 14:23:18.473 5523-5523/example.com.retrofitrxdemo E/MainActivity: 电影排名:千与千寻
10-17 14:23:18.473 5523-5523/example.com.retrofitrxdemo E/MainActivity: 电影排名:辛德勒的名单
10-17 14:23:18.474 5523-5523/example.com.retrofitrxdemo E/MainActivity: 电影排名:盗梦空间
10-17 14:23:18.474 5523-5523/example.com.retrofitrxdemo E/MainActivity: 电影排名:机器人总动员
参考链接:
延伸学习: