字节跳动小姐姐教你用Retrofit-+-RxJava-+-OkHttp-让网络请求变的简单-基础篇

近因为手头上的工作做完了,比较闲,想着做一些优化。看到以前用的那一套网络框架添加一个请求比较麻烦,并且比较难用,所以想改造一下网络框架。现在Android 市面上很火的当然是 Retrofit+RxJava + OkHttp, 功能强大,简单易用,因此选用这套方案来改造网络库。本篇文章是对Retrofit 的基本使用方法做一些简单的介绍。后面会再写一篇 Retrofit + RxJava + OkHttp 的封装过程。以下是正文。

作者:依然范特稀西
链接:https://www.jianshu.com/p/5bc866b9cbb9

简介:

Retrofit: Retrofit是Square 公司开发的一款正对Android 网络请求的框架。底层基于OkHttp 实现,OkHttp 已经得到了google 官方的认可。Retrofit官网

OkHttp: 也是Square 开源的网络请求库

RxJava:RxJava 在 GitHub 主页上的自我介绍是 “a library for composing asynchronous and event-based programs using observable sequences for the Java VM”(一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库)。这就是 RxJava ,概括得非常精准。总之就是让异步操作变得非常简单。

各自的职责:Retrofit 负责请求的数据和请求的结果,使用接口的方式呈现,OkHttp 负责请求的过程,RxJava 负责异步,各种线程之间的切换。

RxJava + Retrofit + okHttp 已成为当前Android 网络请求最流行的方式。

一,Retrofit 写一个网络请求

以获取豆瓣 Top250 榜单为例,地址:https://api.douban.com/v2/movie/

1,首先,要使用Retrofit ,你肯定需要把它的包引入,在你的build.gradle文件中添加如下配置:

compile ‘com.squareup.retrofit2:retrofit:2.1.0’//retrofit
compile ‘com.google.code.gson:gson:2.6.2’//Gson 库
//下面两个是RxJava 和RxAndroid
compile ‘io.reactivex:rxjava:1.1.0’
compile ‘io.reactivex:rxandroid:1.1.0’
compile ‘com.squareup.retrofit2:converter-gson:2.1.0’//转换器,请求结果转换成Model
compile ‘com.squareup.retrofit2:adapter-rxjava:2.1.0’//配合Rxjava 使用

2,创建一个Retrofit 实例,并且完成相关的配置

public static final String BASE_URL = “https://api.douban.com/v2/movie/”;
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();

说明:配置了接口的baseUrl和一个converter,GsonConverterFactory 是默认提供的Gson 转换器,Retrofit 也支持其他的一些转换器,详情请看官网Retrofit官网

3,创建一个 接口 ,代码如下:

public interface MovieService {

//获取豆瓣Top250 榜单
@GET(“top250”)
Call getTop250(@Query(“start”) int start,@Query(“count”)int count);

}

说明:定义了一个方法getTop250,使用get请求方式,加上@GET 标签,标签后面是这个接口的 尾址top250,完整的地址应该是 baseUrl+尾址 ,参数 使用@Query标签,如果参数多的话可以用@QueryMap标签,接收一个Map

4,用Retrofit 创建 接口实例 MoiveService,并且调用接口中的方法进行网络请求,代码如下:

//获取接口实例
MovieService MovieService movieService = retrofit.create(MovieService.class);
//调用方法得到一个Call
Call call = movieService.getTop250(0,20);
//进行网络请求
call.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
mMovieAdapter.setMovies(response.body().subjects);
mMovieAdapter.notifyDataSetChanged();
}
@Override
public void onFailure(Call call, Throwable t) {
t.printStackTrace();
}
});

以上是异步方式请求,还有同步方式execute(),返回一个Response,代码如下:

Response response = call.execute();

以上就是用Retrofit 完成了一个网络请求,获取豆瓣top250 榜单电影,效果图如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

以上示例是用get方式完成,如果要使用post 方式,我们只需要修改一下接口中的方法定义,如下:

public interface MovieService {
//获取豆瓣Top250 榜单
@FormUrlEncoded
@POST(“top250”)
Call getTop250(@Field(“start”) int start, @Field(“count”) int count);
}

说明:使用POST 请求方式时,只需要更改方法定义的标签,用@POST 标签,参数标签用 @Field 或者@Body或者FieldMap,注意:使用POST 方式时注意2点,1,必须加上 @FormUrlEncoded标签,否则会抛异常。2,使用POST方式时,必须要有参数,否则会抛异常, 源码抛异常的地方如下:

if (isFormEncoded && !gotField) {
throw methodError(“Form-encoded method must contain at least one @Field.”);
}

以上就是一个使用Retrofit 完成一个网络请求的完整示例,其他标签使用方式请看官网Retrofit官网,官网用法也介绍的比较详细,此外,发现了一篇博客也介绍得比较详细,Retrofit用法详解

二,配合RxJava 使用

1, 更改定义的接口,返回值不再是一个Call ,而是返回的一个Observble.

public interface MovieService {
//获取豆瓣Top250 榜单
@GET(“top250”)
Observable getTop250(@Query(“start”) int start, @Query(“count”)int count);
}

2,创建Retrofit 的时候添加如下代码

addCallAdapterFactory(RxJavaCallAdapterFactory.create())

3,添加转换器Converter(将json 转为JavaBean)

addConverterFactory(GsonConverterFactory.create())

4,Activity 或者 Fragment 中传入 Subscriber 建立订阅关系

最后看一下学习需要的所有知识点的思维导图。在刚刚那份学习笔记里包含了下面知识点所有内容!文章里已经展示了部分!如果你正愁这块不知道如何学习或者想提升学习这块知识的学习效率,那么这份学习笔记绝对是你的秘密武器!


《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

[外链图片转存中…(img-QVELn9Uk-1715251588261)]
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值