一个App带你学会Retrofit2.0,麻麻再也不用担心我的网络请求了!
Retrofit、Retrofit、Retrofit,越来越多的人在玩这个网络请求框架,这个由squareup公司开源的网络请求框架确实挺好用,今天我们就来看一下这个东东怎么玩!
Retrofit作为一个简化的HTTP请求库其实已经有很长一段时间了,只不过在早期的版本里有些地方用的不是特别爽,Retrofit从2.0开始修改了许多之前的痛点,现在不仅更好用而且功能也更加的强大。我们可以在Retrofit中利用接口、方法和注解参数等来声明定义一个请求该如何被创建。同时它还有一个非常鲜明的特点就是支持REST风格的请求,同时它还很好的解决了线程异步访问问题,支持RxJava等。好了,废话不多说,我们先来看看今天要实现的效果图。
我们就来做这样一个简单的列表,看看如何使用Retrofit来实现。OK,这里主要通过如下四步来使用Retrofit。
1.导包
2.定义API接口
3.初始化Retrofit
4.发起网络请求
1.导包
要使用Retrofit,首先肯定是导包,我这里导入两个包,如下:
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
一个包是Retrofit的包,还有一个是Json转换的工具包(具体作用看第三小节)。
2.定义API接口
接下来我们来定义相关的网络请求接口,在Retrofit2.0中,APIService的定义也将是一个非常简单的事情,比如我们这个案例,我定义的APIService如下:
public interface ApiService {
//获取TabLayout上的数据
@GET("api/lore/classify")
Call<ClassfyBean> getClassfyData();
//获取首页列表的数据
@GET("api/lore/list")
Call<CateItemBean> getListData(@Query("id") int id);
//获取详情数据
@GET("api/lore/show")
Call<DetailBean> getDetailData(@Query("id") int id);
}
@GET表示该请求为一个get请求,常用的还有@POST表示该请求为一个POST请求。@GET后面的参数表示请求的路径但是不包括域名,第一个方法由于是获取TabLayout上的数据,这个接口不需要参数,第二第三个方法在请求数据时都需要传递参数,所以该方法带有参数,@Query("id")表示该参数名为id。以第二个方法为例,带参数的请求实际上等同这样:api/lore/list?id=id,这里需要注意的是,这种方式适用于get请求,POST请求还需要添加上@FormUrlEncoded注解,表示以表单的方式来提交参数。举个栗子:
@FormUrlEncoded
@POST("api/lore/list")
Call<CateItemBean> getListData(@Field("id") int id);
Call请求接收一个泛型参数,该参数表示该请求的返回对象,Retrofit在收到返回值之后会根据我们传递的对象转换工厂方法将返回值转为该对象。
3.初始化Retrofit
定义好了APIService之后,接下来我们就可以初始化Retrofit了,Retrofit的初始化很简单,如下:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://www.tngou.net/")
.addConverterFactory(GsonConverterFactory.create())
.build();
baseUrl其实就是我们请求地址的域名,这个域名配合上文的APIService中的参数才是一个完整的请求路径。addConverterFactory表示一个添加一个转换工厂,因为我这里请求的数据是为JSON数据,所以添加GsonConverterFactory.create(),表示将接收到的Json数据转换为一个DAO,官方提供的转换工厂除了我们用的这个之外,还有如下几个:
Gson: com.squareup.retrofit:converter-gson
Jackson: com.squareup.retrofit:converter-jackson
Moshi: com.squareup.retrofit:converter-moshi
Protobuf: com.squareup.retrofit:converter-protobuf
Wire: com.squareup.retrofit:converter-wire
Simple XML: com.squareup.retrofit:converter-simplexml
如果需要使用则把相应的包添加进来即可。
OK,这是一个最最基本的配置,Retrofit的网络请求使用了OKHttp,但是我们这里怎么没有配置呢?如果你不配置,系统会默认创建一个OKHttp对象,如果你配置了那也没问题,配置方式如下:
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(5, TimeUnit.SECONDS)
.readTimeout(10,TimeUnit.SECONDS)
.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://www.tngou.net/")
.addConverterFactory(GsonConverterFactory.create())
.client(client)
.build();
4.发起网络请求
做完上面几步之后,接下来我们就可以发起一个网络请求了,代码如下:
ApiService apiService = retrofit.create(ApiService.class);
Call<ClassfyBean> call = apiService.getClassfyData();
call.enqueue(new Callback<ClassfyBean>() {
@Override
public void onResponse(Call<ClassfyBean> call, Response<ClassfyBean> response) {
ClassfyBean body = response.body();
List<Fragment> fragments = new ArrayList<Fragment>();
for (int i = 0; i < body.getTngou().size(); i++) {
fragments.add(BaseFragment.getInstance(body.getTngou().get(i).getId()));
}
VpAdapter adapter = new VpAdapter(getSupportFragmentManager(), fragments, body);
viewPager.setAdapter(adapter);
tabLayout.setupWithViewPager(viewPager);
} @Override
public void onFailure(Call<ClassfyBean> call, Throwable t) {
Log.d("google_lenve", "onFailure: "+t.getMessage());
}
});
在这里,我们先通过retrofit.create方法获取 一个APIService实例,然后调用该实例中对应的获取数据的方法,获取一个call,拿到call之后我们有两个选择(类似于OKHttp中的call),一个是调用call中的execute()方法获取一个Response对象,代码如下:
Response<ClassfyBean> execute = call.execute();
但是这个方法会阻塞线程,在Android中如果调用这个方法需要我们将这一行代码放在子线程中执行,这无疑会增大我们的代码量。所以一个推荐的方法是调用call中的enqueue方法,这是一个异步请求,类似于OKHttp中的enqueue,不同的是这里的两个回调方法onResponse和onFailure都是在主线程中执行,意味着我们可以直接在这两个回调方法中更新UI,爽吧!
5.其他
以上几个知识点已经可以实现我们的需求了,但是既然说到了Retrofit,那我们就再来聊聊它的其他一些功能点。
在Retrofit中还有一个注解叫做@Path,这个表示URL地址的一个占位符,使用方式如下:
@GET("api/{id}/delete")
Call<DetailBean> getData(@Path("id")String id);
还有一个注解@Header,表示添加请求头信息。。还有很多其他注解,由于用的比较少,我这里就不再介绍了。
OK,这篇介绍就到这里,后面我们再来说说Retrofit配合RxJava使用的问题。
以上。。。
文章一开始的项目地址:https://github.com/lenve/Retrofit
一个App带你学会Retrofit2.0,麻麻再也不用担心我的网络请求了!的更多相关文章
- zzulioj--1841--so easy!麻麻再也不用担心我的数学了!(数学水题)
1841: so easy!麻麻再也不用担心我的数学了! Time Limit: 1 Sec Memory Limit: 128 MB Submit: 27 Solved: 15 SubmitSt ...
- 万能的SqlHelper,麻麻再也不用担心用什么数据库了
以前只用一种数据库,倒也无所谓,但是再数据库切换的时候,发现代码差不多呀. 最初,两种数据库,大不了写两个SqlHelper,但是多了也就发现代码重用率太低了吧. 因此,下面的SqlHelper诞生了 ...
- webstorm 编辑器破解 (麻麻再也不用担心过期了)
先去官网下载webstorm2016.1.3版本(目前只知道2016.1这个版本可以永久破解,不会过期) 再下载webstorm2016.1的破解补丁 将下载好的破解补丁解压,会有一个Jetbrain ...
- 学会这个删库再也不用跑路了~ --技术流ken
前言 相信每一个学IT的人或多或少都听说过从删库到跑路这个梗~下图也是在各种交流群屡禁不止,新人听着也是瑟瑟发抖. 人们茶余饭后,街头巷角难免要问... 下面技术流ken就教给各位新手们一招删库再也不 ...
- 「4.0」一个人开发一个App,小程序从0到1,布局
一提到布局这个词,我总是索索发抖,不是因为天冷,而是因为布局的目标实在太宏大.古代想雄霸天下的王,就喜欢布局这个,布局那个,结果硬生生把自己的国家给布局没了.至于是哪个君王,我倒可以非常认真,非常坦诚 ...
- 「2.0」一个人开发一个App,小程序从0到1,文件剖析
不知你是不是见到“文件剖析”这4个大字,才点进来看一看的?如果真是的话,那我可以坦诚.真心.负责任地告诉你:你上当了,你上了贼船啦,如果你现在想跳的话,还来得及,反正茫茫大海中,鲨鱼正缺搞程序的人.说 ...
- [3.0] 一个人开发一个App,小程序从0到1,删减添加
在这个黄道吉日,咱们将要干一件,惊天地泣鬼神,妇孺皆知的大事,那就是删掉微信开发工具自动生成的源代码. 删掉pages下的index.logs目录,啥都不留: 删掉utils下的util.js,只流空 ...
- 「1.0」一个人开发一个App,小程序从0到1,起航了
古有,秦.齐.楚.赵.魏.韩.燕七国争雄:今有,微信.QQ.百度.支付宝.钉钉.头条.抖音七台争霸.古有,白起.李牧.王翦.孙膑.庞涓.赵奢.廉颇驰骋疆场:今有程序员1,程序员2,程序员3…编写代码. ...
- JDK自带工具一览表。妈妈再也不用担心你到处去下载小软件了~~
原来JDK早早就给我准备好了要用到的工具..反编译,JVM性能监视.诊断. JDK(Java Development Kit)是Java程序员最核心的开发工具,没有之一. JDK是一个功能强大的Jav ...
随机推荐
- VJP1456 最小总代价(状压)
链接 这题卡了一天 刚开始没考虑第一个传的和最后一个传的 感觉挺简单 啪啪的敲完 居然还过了17组数据.. 正解:dp数组一维保存状态 一维保存当前传到了谁 再枚举是由谁传过来的 这样可以保证正确性 ...
- hdu4671Backup Plan
http://acm.hdu.edu.cn/showproblem.php?pid=4671 这个高端的题意啊 看了N久啊 n>m时 直接第一列按顺序来 第二列为M+1 else 第一列顺序 ...
- C#排序算法的比较
首先通过图表比较不同排序算法的时间复杂度和稳定性. 排序方法 平均时间 最坏情况 最好情况 辅助空间 稳定性 直接插入排序 O(n2) O(n2) O(n) O(1) 是 冒泡排序 O(n2) O(n ...
- BZOJ_[HNOI2008]_Cards_(置换+Burnside引理+乘法逆元+费马小定理+快速幂)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1004 共n个卡片,染成r,b,g三种颜色,每种颜色的个数有规定.给出一些置换,可以由置换得到的 ...
- 【转】基本数据持久性(一) 使用plist保存和读取数据
原文网址:http://www.it165.net/pro/html/201309/7170.html 想保存成绩.记录得分.保存账号密码等等?数据持久性可以做到这一点!这篇文章通过简单的程序,来分享 ...
- C#使用Word中的内置对话框实例
本文实例讲述了C#使用Word中的内置对话框的方法,分享给大家供大家参考.具体实现方法如下: 使用 Microsoft Office Word 时,有时需要显示用户输入对话框.虽然可以创建自己的对话框 ...
- C#用xpath查找某节点
C#用xpath查找某节点 从根节点一直下来的相对路径才能确定Xpath的写法. /root/<节点1>/<节点2>//<@属性> Xpath是功能很强大的,但是也 ...
- Linux使用sudo提权时,出现xx 不在 sudoers 文件中。此事将被报告。visudo 命令简单介绍。
在使用 sudo 临时提权时,出现:不在 sudoers 文件中.此事将被报告. 可以使用 visudo命令 来配置/etc/sudoers文件,将目标用户赋予使用sudo命令的能力. visudo命 ...
- 添加iis的wolf、wolf2、json支持
1.打开“mime类型”,添加: 如下“文件扩展名”和“mime类型”: .woff application/x-font-woff .woff2 applic ...
- 设计模式_Adapt
一个形象的例子: (ADAPTER)在朋友聚会上碰到了一个美女Sarah,从香港来的,可我不会说粤语,她不会说普通话,只好求助于我的朋友kent了,他作为我和Sarah之间的Adapter,让我和Sa ...