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

  • 测试的接口:https://api.douban.com/v2/movie/
    我先用Postman跑了一遍,测试一下接口和参数以及得到后面的返回结果。
    Android学习之RxJava+Retrofit+okhttp3的使用_第1张图片Postman的使用教程:https://blog.csdn.net/fxbin123/article/details/80428216
    开始创建接口:
public interface  HttpService {
    @GET("top250")
    ObservablegetTop(@Query("start") int start,@Query("count") int count);
    
    @FormUrlEncoded
    @POST("top250")
    ObservablegetTop1(@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() {
                              @Override
                              public void onSubscribe(Disposable d) {
                              Log.e(TAG,"onSubscribe");
                              }

                              @Override
                              public void onNext(MovieBean movieBean) {
                              Log.e(TAG,"请求成功");
                              Listlist=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: 电影排名:机器人总动员

参考链接:

  • https://blog.csdn.net/DeMonliuhui/article/details/77868677
  • RxJava2+Retrofit2+OkHttp3的基础、封装和项目中的使用

延伸学习:

  • Retrofit网络请求参数注解,@Path、@Query、@QueryMap…
  • 【Android实战】----Android Retrofit2.1.0直接发送Json字符串到服务器
  • retrofit中使用body标签传RequestBody
  • Retrofit 网络请求之@Body标签遇到的坑

你可能感兴趣的:(各种框架学习)