Android学习之RxJava+Retrofit+okhttp3的使用

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.创建接口

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: 电影排名:机器人总动员

参考链接:

延伸学习:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值