android开发笔记之Retrofit
Retrofit 简介
A type-safe HTTP client for Android and Java
在Android网络请求库中,Retrofit是当下最热的一个网络请求库.
建议在使用前,阅读一下下面这篇文章:
Android Retrofit 2.0 的详细 使用攻略(含实例讲解)
https://www.jianshu.com/p/a3e162261ab6
Retrofit Demo: 将中文翻译成英文
实现方案:
采用Get方法对 金山词霸API 发送网络请求,采用 Gson 进行数据解析.得到数据后,在UI的TextView上显示得到的网络数据.
步骤说明:
步骤1:添加Retrofit库的依赖
步骤2:创建接收服务器返回数据的类
步骤3:创建用于描述网络请求的接口
步骤4:创建Retrofit实例
步骤5:创建网络请求接口实例并配置网络请求参数
步骤6:发送网络请求(采用最常用的异步方式)
步骤7: 处理服务器返回的数据
具体实现:
步骤1:添加Retrofit库的依赖
这里直接添加Retrofit库和converter-gson库
build.gradle
dependencies {implementation 'com.squareup.retrofit2:retrofit:2.5.0'implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
}
添加网络权限
AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET"/>
步骤2:创建接收服务器返回数据的类
金山词霸API 的数据格式说明如下:
// URL模板
http://fy.iciba.com/ajax.php// URL实例
http://fy.iciba.com/ajax.php?a=fy&f=auto&t=auto&w=hello%20world// 参数说明:
// a:固定值 fy
// f:原文内容类型,日语取 ja,中文取 zh,英语取 en,韩语取 ko,德语取 de,西班牙语取 es,法语取 fr,自动则取 auto
// t:译文内容类型,日语取 ja,中文取 zh,英语取 en,韩语取 ko,德语取 de,西班牙语取 es,法语取 fr,自动则取 auto
// w:查询内容
根据金山词霸API的数据格式,创建接收服务器返回数据的类
Translation.java
public class Translation {private int status;private content content;private static class content {private String from;private String to;private String vendor;private String out;private int errNo;}//定义输出返回数据的方法public String show() {return "status:"+status+" content.from:"+content.from+" content.to:"+content.to+" content.vendor:"+content.vendor+" content.out:"+content.out+" content.errNo:"+content.errNo;}
}
步骤3:创建用于描述网络请求的接口
采用 **注解 ** 描述 网络请求参数。
GetRequest_Interface.java
public interface GetRequest_Interface {@GET("ajax.php?a=fy&f=auto&t=auto&w=hello%20 one")Call<Translation> getCall();// 注解里传入 网络请求 的部分URL地址// Retrofit把网络请求的URL分成了两部分:一部分放在Retrofit对象里,另一部分放在网络请求接口里// 如果接口里的url是一个完整的网址,那么放在Retrofit对象里的URL可以忽略// getCall()是接受网络请求数据的方法
}
接下来的步骤均在GetRequest.java内实现(看注释)
步骤4:创建Retrofit对象
步骤5:创建 网络请求接口 的实例
步骤6:发送网络请求
public class MainActivity extends AppCompatActivity {private final static String TAG = "RxJavaDemo";private TextView textView;private Button button;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);init();}private void init() {textView = (TextView) findViewById(R.id.textView);button = (Button) findViewById(R.id.button);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Log.i(TAG,"button--onClick");onDoRetrofitDemo();}});}private void onDoRetrofitDemo() {//步骤4:创建Retrofit对象Retrofit retrofit = new Retrofit.Builder().baseUrl("http://fy.iciba.com/") // 设置 网络请求 Url.addConverterFactory(GsonConverterFactory.create()) //设置使用Gson解析(记得加入依赖).build();// 步骤5:创建网络请求接口的实例GetRequest_Interface request = retrofit.create(GetRequest_Interface.class);//对发送请求进行封装Call<Translation> call = request.getCall();//步骤6:发送网络请求(异步)call.enqueue(new Callback<Translation>() {//请求成功时回调@Overridepublic void onResponse(Call<Translation> call, Response<Translation> response) {// 步骤7:处理返回的数据结果Log.i(TAG,response.body().show());textView.setText(""+response.body().show());}//请求失败时回调@Overridepublic void onFailure(Call<Translation> call, Throwable throwable) {textView.setText("连接失败");}});}}
运行结果:
05-09 11:14:06.722 21814-21814/com.readygo.rxjavademo I/RxJavaDemo: button--onClick
05-09 11:14:06.784 21814-21814/com.readygo.rxjavademo D/NetworkSecurityConfig: No Network Security Config specified, using platform default
05-09 11:14:07.442 21814-21814/com.readygo.rxjavademo I/RxJavaDemo: status:1 content.from:null content.to:null content.vendor:null content.out: content.errNo:0
05-09 11:14:10.949 21814-21814/com.readygo.rxjavademo I/RxJavaDemo: button--onClick
05-09 11:14:11.642 21814-21814/com.readygo.rxjavademo I/RxJavaDemo: status:1 content.from:en-EU content.to:zh-CN content.vendor:tencent content.out:你好一号 content.errNo:0
Retrofit + RxJava: 将中文翻译成英文
还是上面的例子,我们使用Retrofit + RxJava的方式来实现
绝大部分的代码一样,只需要修改部分代码.
具体实现:
步骤1:添加Retrofit库的依赖
这里直接添加Retrofit库和converter-gson库
build.gradle
dependencies {implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'implementation 'io.reactivex.rxjava2:rxjava:2.2.8'implementation 'com.squareup.retrofit2:retrofit:2.5.0'implementation 'com.squareup.retrofit2:converter-gson:2.5.0'// 衔接 Retrofit & RxJava// 此处一定要注意使用RxJava2的版本implementation 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
}
添加网络权限
AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET"/>
步骤2:创建接收服务器返回数据的类
这一步,同上.
步骤3:创建用于描述网络请求的接口
采用 **注解 ** 描述 网络请求参数。
GetRequest_Interface.java
public interface GetRequest_Interface {@GET("ajax.php?a=fy&f=auto&t=auto&w=hello%20 one")//Call<Translation> getCall();Observable<Translation> getCall();// 注解里传入 网络请求 的部分URL地址// Retrofit把网络请求的URL分成了两部分:一部分放在Retrofit对象里,另一部分放在网络请求接口里// 如果接口里的url是一个完整的网址,那么放在Retrofit对象里的URL可以忽略// getCall()是接受网络请求数据的方法
}
这一步,和上面的例子有区别,区别也只是一行代码:
Observable<Translation> getCall();
接下来的步骤均在GetRequest.java内实现(看注释)
步骤4:创建Retrofit对象
步骤5:创建 网络请求接口 的实例
步骤6:发送网络请求
public class MainActivity extends AppCompatActivity {private final static String TAG = "RxJavaDemo";private TextView textView;private Button button;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);init();}private void init() {textView = (TextView) findViewById(R.id.textView);button = (Button) findViewById(R.id.button);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Log.i(TAG,"button--onClick");onDoRetrofitRxJavaDemo();}});}
private void onDoRetrofitRxJavaDemo() {//步骤4:创建Retrofit对象Retrofit retrofit = new Retrofit.Builder().baseUrl("http://fy.iciba.com/") // 设置 网络请求 Url.addConverterFactory(GsonConverterFactory.create()) //设置使用Gson解析(记得加入依赖).addCallAdapterFactory(RxJava2CallAdapterFactory.create()) // 支持RxJava.build();// 步骤5:创建 网络请求接口 的实例GetRequest_Interface request = retrofit.create(GetRequest_Interface.class);// 步骤6:采用Observable<...>形式 对 网络请求 进行封装Observable<Translation> observable = request.getCall();// 步骤7:发送网络请求observable.subscribeOn(Schedulers.io()) // 在IO线程进行网络请求.observeOn(AndroidSchedulers.mainThread()) // 回到主线程 处理请求结果.subscribe(new Observer<Translation>() {@Overridepublic void onSubscribe(Disposable d) {Log.d(TAG, "开始采用subscribe连接");}@Overridepublic void onNext(Translation result) {// 步骤8:对返回的数据进行处理result.show();Log.i(TAG,result.show());textView.setText(""+result.show());}@Overridepublic void onError(Throwable e) {Log.d(TAG, "请求失败");}@Overridepublic void onComplete() {Log.d(TAG, "请求成功");}});}}
运行结果:
05-09 12:21:58.991 23072-23072/com.readygo.rxjavademo I/RxJavaDemo: button--onClick
05-09 12:21:59.031 23072-23072/com.readygo.rxjavademo D/NetworkSecurityConfig: No Network Security Config specified, using platform default
05-09 12:21:59.097 23072-23072/com.readygo.rxjavademo D/RxJavaDemo: 开始采用subscribe连接
05-09 12:21:59.644 23072-23072/com.readygo.rxjavademo I/RxJavaDemo: status:1 content.from:en-EU content.to:zh-CN content.vendor:tencent content.out:你好一号 content.errNo:0
05-09 12:21:59.645 23072-23072/com.readygo.rxjavademo D/RxJavaDemo: 请求成功
其他例子
当然,Rxtrofit+ RxJava,还有许多其他例子,我们可以类比的进行学习和使用.
Android:Retrofit 结合 RxJava的优雅使用(含实例教程)
https://www.jianshu.com/p/2c54f9ccd52f
这篇文章还有5个例子,如果你有兴趣也可以阅读了:
5.1 网络请求轮询(无条件)
5.2 网路请求轮询(有条件)
5.3 网络请求嵌套回调
5.4 网络请求出错重连
5.5 合并数据源 & 统一显示
参考资料
1.github retrofit
https://github.com/square/retrofit
2.retrofit的官网
http://square.github.io/retrofit/
3.retrofit api
http://square.github.io/retrofit/2.x/retrofit/
android开发笔记之Retrofit相关推荐
- Android开发笔记(序)写在前面的目录
知识点分类 一方面写写自己走过的弯路掉进去的坑,避免以后再犯:另一方面希望通过分享自己的经验教训,与网友互相切磋,从而去芜存菁进一步提升自己的水平.因此博主就想,入门的东西咱就不写了,人不能老停留在入 ...
- Android开发笔记(一百一十)使用http框架上传文件
HTTP上传 与文件下载相比,文件上传的场合不是很多,通常用于上传用户头像.朋友圈发布图片/视频动态等等,而且上传文件需要服务器配合,所以容易被app开发者忽略.就上传的形式来说,app一般采用htt ...
- Android开发笔记(序)
本开发笔记,借鉴与其他开发者整理的文章范例与心得体会.在这里作为开发过程中的一个总结与笔记式记录. 如有侵犯作者权益,请及时联系告知删除.俗话说:集百家成一言,去粕成金. ************** ...
- Android开发笔记(序)写在前面的目录大全
转自 湖前琴亭 的博客https://blog.csdn.net/aqi00/article/details/50012511 知识点分类 一方面写写自己走过的弯路掉进去的坑,避免以后再犯:另一方面 ...
- Andriod开发之二十:Android开发笔记(序)写在前面的目录
https://blog.csdn.net/aqi00/article/details/50038385 知识点分类 一方面写写自己走过的弯路掉进去的坑,避免以后再犯:另一方面希望通过分享自己的经验教 ...
- 《ArcGIS Runtime SDK for Android开发笔记》——离在线一体化技术:概述
1.前言 数据生产和数据展示是常见的两大专业级移动GIS应用场景,这里我们针对数据生产环节的ArcGIS的离在线一体化技术给大家做一个基本的介绍和梳理. 使用ArcGIS离在线一体化技术首先需要以下基 ...
- 《ArcGIS Runtime SDK for Android开发笔记》——离在线一体化技术:离线矢量数据同步...
1.前言 上一篇文章中我们实现了离线要素的编辑操作,这一篇中主要介绍离在线一体化技术中最后一个环节离线数据的同步功能,通过对数据的上传,服务器端的版本化管理,实现数据生产管理的整个流程. 转载请注明出 ...
- 《ArcGIS Runtime SDK for Android开发笔记》——离在线一体化技术:离线矢量数据编辑...
1.前言 在上一篇我们已经实现了离线地理数据库的下载,这一篇我们着重介绍离线数据库的加载与编辑. 由于ArcGIS Runtime SDK for Android 10.2.X版本并没提供要素绘制功能 ...
- 《ArcGIS Runtime SDK for Android开发笔记》——离在线一体化技术:离线矢量数据下载...
1.前言 1.1.环境准备: ArcGIS for Desktop 10.4.1(10.2.1以上版本即可) ArcGIS for Server 10.4.1 (10.2.1以上版本即可) Postg ...
最新文章
- cocos2dx3.4 VS2012无法打开包含文件extensions/ExtensionExport.h
- Django REST framework 版本
- 聊聊推荐系统中的偏差
- 【Git】Git兼容GitHub和Gitee的问题与对策
- 华科计算机网络报告,华科-计算机网络实验报告-Java Socket编程-网络组建实验
- C语言读写txt文件
- 沪江swf文件怎么打开_沪江课件播放器swf player_flash swf播放器_沪江swf播放器播放不了...
- word中二级标题随一级标题自动编号
- 万娟 白话大数据和机械学习_《白话大数据与机器学习》.pdf
- 云主机挂载云硬盘的操作姿势
- table 表格合并行或列
- zigbee3.0 BDB 介绍(一)
- 个人信息保护相关的重要法规及规范性文件汇总目录
- 方向导数的几何通俗解释
- [系统安全] Windbg Preview调试记录
- 如何转换DWG文件格式?来试试这两种方法
- 批量的十六进制转字符串(ASCII码)	shell脚本
- sql中日期和时间戳的相互转换
- 东汉魏晋南北朝时期职业教徒的阶层分析
- 了解RPG游戏中剧情播放器的制作原理及流程