Retrofit2+Rxjava2的用法
近几年,Retrofit犹如燎原之火搬席卷了整个Android界。要是不懂Retrofit,简直不好意思出门。。。
由于近几个项目都没用到Retrofit,无奈只能业余时间自己撸一下,写的不好的地方,还请不吝赐教。
要集成retrofit,在app的build.gradle中添加库以来就可以:
compile 'com.squareup.retrofit2:retrofit:2.3.0'
如果需要集成json解析,还需要添加库:
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
如果还需要集成rxjava,还需要添加库:
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
添加库完毕,接下来需要定义请求接口:
public interface TestService {
/**
* 获取新闻 使用rxjava
* @return
*/
@POST(AppConstance.NEWS_URL)
Observable<NewsBean> getNewsWithRxJava(@Query("key") String key, @Query("type") String type);
/**
* 获取新闻 不使用rxjava
* @return
*/
@POST(AppConstance.NEWS_URL)
Call<ResponseBody> getNewsWithoutRxJava(@Query("key") String key, @Query("type") String type);
}
这个接口是我在聚合数据申请的测试接口,我将其分为两种情况:使用rajava、不使用rxjava。
正常使用中,都会将Retrofit进行封装,我在这里将其简单的封装:
public class RetrofitUtil {
private volatile static RetrofitUtil sInstance;
private Retrofit mRetrofit;
private TestService mTestService;
private RetrofitUtil(){
mRetrofit = new Retrofit.Builder()
.baseUrl(AppConstance.APP_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
mTestService = mRetrofit.create(TestService.class);
}
public static RetrofitUtil getInstance(){
if (sInstance == null){
synchronized(RetrofitUtil.class){
if (sInstance == null){
sInstance = new RetrofitUtil();
}
}
}
return sInstance;
}
public TestService getTestService(){
return mTestService;
}
}
万事具备,现在开始在Activity中测试Retrofit。
xml文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="org.shenchanghui.retrofit2withrxjava2_demo.MainActivity">
<Button
android:id="@+id/btn_get_news_with_rx_java"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:text="获取新闻(使用rxjava)" />
<Button
android:id="@+id/btn_get_news_without_rx_java"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/btn_get_news_with_rx_java"
android:text="获取新闻(不使用Rxjava)" />
</RelativeLayout>
界面截图如下:

在Activity中请求数据,首先,不使用rajava:
findViewById(R.id.btn_get_news_without_rx_java).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
long time1 = System.currentTimeMillis();
Call<ResponseBody> call = RetrofitUtil.getInstance().getTestService()
.getNewsWithoutRxJava("8bf17cf1c321723f060d5dc5c4da871a", "top");
long time2 = System.currentTimeMillis();
Log.e("MainActivity", "请求耗时:" + (time2 - time1) + "ms");
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
try {
String result = response.body().string();
Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show();
Log.e("MainActivity", "Thread.currentThread():" + Thread.currentThread());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Toast.makeText(MainActivity.this, t.toString(), Toast.LENGTH_SHORT).show();
}
});
}
});
运行项目,成功获取返回的json字符串。
log截图:

创建实体类,用GsonFormat插件将获取的json字符串生成实体类,用以解析json。
实体类:
public class NewsBean {
private String reason;
private ResultBean result;
private int error_code;
@Override
public String toString() {
return "NewsBean{" +
"reason='" + reason + '\'' +
", result=" + result +
", error_code=" + error_code +
'}';
}
public String getReason() {
return reason;
}
public void setReason(String reason) {
this.reason = reason;
}
public ResultBean getResult() {
return result;
}
public void setResult(ResultBean result) {
this.result = result;
}
public int getError_code() {
return error_code;
}
public void setError_code(int error_code) {
this.error_code = error_code;
}
public static class ResultBean {
private String stat;
private List<DataBean> data;
@Override
public String toString() {
return "ResultBean{" +
"stat='" + stat + '\'' +
", data=" + data +
'}';
}
public String getStat() {
return stat;
}
public void setStat(String stat) {
this.stat = stat;
}
public List<DataBean> getData() {
return data;
}
public void setData(List<DataBean> data) {
this.data = data;
}
public static class DataBean {
private String uniquekey;
private String title;
private String date;
private String category;
private String author_name;
private String url;
private String thumbnail_pic_s;
private String thumbnail_pic_s02;
private String thumbnail_pic_s03;
@Override
public String toString() {
return "DataBean{" +
"uniquekey='" + uniquekey + '\'' +
", title='" + title + '\'' +
", date='" + date + '\'' +
", category='" + category + '\'' +
", author_name='" + author_name + '\'' +
", url='" + url + '\'' +
", thumbnail_pic_s='" + thumbnail_pic_s + '\'' +
", thumbnail_pic_s02='" + thumbnail_pic_s02 + '\'' +
", thumbnail_pic_s03='" + thumbnail_pic_s03 + '\'' +
'}';
}
public String getUniquekey() {
return uniquekey;
}
public void setUniquekey(String uniquekey) {
this.uniquekey = uniquekey;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public String getAuthor_name() {
return author_name;
}
public void setAuthor_name(String author_name) {
this.author_name = author_name;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getThumbnail_pic_s() {
return thumbnail_pic_s;
}
public void setThumbnail_pic_s(String thumbnail_pic_s) {
this.thumbnail_pic_s = thumbnail_pic_s;
}
public String getThumbnail_pic_s02() {
return thumbnail_pic_s02;
}
public void setThumbnail_pic_s02(String thumbnail_pic_s02) {
this.thumbnail_pic_s02 = thumbnail_pic_s02;
}
public String getThumbnail_pic_s03() {
return thumbnail_pic_s03;
}
public void setThumbnail_pic_s03(String thumbnail_pic_s03) {
this.thumbnail_pic_s03 = thumbnail_pic_s03;
}
}
}
}
接下里,使用rxjava,请求数据(自动返回解析好的数据):
findViewById(R.id.btn_get_news_with_rx_java).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
RetrofitUtil.getInstance().getTestService()
.getNewsWithRxJava("8bf17cf1c321723f060d5dc5c4da871a", "top")
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<NewsBean>() {
private Disposable mDisposable;
@Override
public void onSubscribe(Disposable d) {
mDisposable = d;
}
@Override
public void onNext(NewsBean value) {
Toast.makeText(MainActivity.this, value.toString(), Toast.LENGTH_SHORT).show();
mDisposable.dispose();//注销
}
@Override
public void onError(Throwable e) {
Toast.makeText(MainActivity.this, e.toString(), Toast.LENGTH_SHORT).show();
mDisposable.dispose();//注销
}
@Override
public void onComplete() {
}
});
}
});
运行程序,成功获取请求结果。
效果截图:

小小Demo,供大家参考,请大家不吝赐教!
Retrofit2+Rxjava2的用法的更多相关文章
- 使用Retrofit2+RxJava2+ProtoBuf实现网络请求
引言 Retrofit 是一个用于 Android 和 Java 平台的类型安全的,底层使用OkHttp实现网络请求框架.Retrofit 通过将 API 抽象成 Java 接口而让我们连接到 RES ...
- 浅谈Retrofit2+Rxjava2
近几年,Retrofit犹如燎原之火搬席卷了整个Android界.要是不懂Retrofit,简直不好意思出门...由于近几个项目都没用到Retrofit,无奈只能业余时间自己撸一下,写的不好的地方,还 ...
- Retrofit2+Rxjava2 okhttp RxBus 使用记录
学习 博客 http://blog.csdn.net/r17171709/article/details/51149350 @Query 后面跟要添加的字段 @Path 连接url里面{userId} ...
- Retrofit2与RxJava用法大全
Retrofit2是square公司出品的一个网络请求库,网上有很多相关的介绍.我很久以前都想去研究了,但一直都有各种事情耽搁,现在就让我们一起去捋一捋,这篇主要讲解Retrofit2与RxJava的 ...
- 带你封装自己的MVP+Retrofit+RxJava2框架(一)
前言 文本已经收录到我的Github个人博客,欢迎大佬们光临寒舍:我的GIthub博客 看完本篇文章的,可以看下带你封装自己的MVP+Retrofit+RxJava2框架(二),里面封装得到了改进 本 ...
- Android Weekly Notes Issue #248
Android Weekly Issue #248 March 5th, 2017 Android Weekly Issue #248. 本期内容包括: 为什么有时候应该让你的应用崩溃(而不是一味保护 ...
- 从零开始搭建Android组件化框架
问题 在已经开发过几个项目的童鞋,如果这时需要重新开发一个新项目,是否需要自己重新搭建框架呢,还是从老项目中拷贝粘贴? 我们是否可以封装一个底层的lib库,这个底层的公共基础库 包括了一些第三方库(如 ...
- Android中的设计模式之观察者模式
参考 <设计模式:可复用面向对象软件的基础 >5.7 Observer 观察者 对象行为型模式 <设计模式解析> 18.4 Observer模式 <Android源码设计 ...
- 关于RxJava背压
http://flyou.ren/2017/04/05/%E5%85%B3%E4%BA%8ERxJava%E8%83%8C%E5%8E%8B/?utm_source=tuicool&utm_m ...
随机推荐
- Python基础-python变量(三)
一.什么是变量 顾名思义:变量就是可以改变的量 如: z=0 x=5 y=5 z=x+y(z=?) 上方的z就是变量,其值可以改变. 通俗的理解就是: 变量 = 生活中的容器(饭盒) 变量赋值= 把东 ...
- 373. Find K Pairs with Smallest Sums 找出求和和最小的k组数
[抄题]: You are given two integer arrays nums1 and nums2 sorted in ascending order and an integer k. D ...
- .NET, ASP.NET, ADO.NET, C# 区别
1. .NET 是一套框架 1.1 CLR (common language runtime) 公共语言运行时,-提供内在管理,代码安全性检测等功能 1.1.1 CLS (common langua ...
- linux/windows转mac的习惯设置
外接键盘 常用快捷键设置 中英文快捷键名都重新设置一遍 使用ctrl替代command(对 内置 键盘操作) https://jingyan.baidu.com/article/6f2f55a1465 ...
- centos 7 命令行模式和桌面版之间的切换
CentOS7图形界面与命令行界面切换 在图形界面使用 ctrl+alt+F2切换到dos界面 dos界面 ctrl+alt+F2切换回图形界面 在命令上 输入 init 命令 切换到dos界面 输入 ...
- 彻底关闭win10后台同步数据(转自技术社区)
设置隐私里面关闭所有同步数据选项 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\将下面子项属性修改 OneSyncSvc的start属相修改 ...
- Linux驱动之按键驱动编写(中断方式)
在Linux驱动之按键驱动编写(查询方式)已经写了一个查询方式的按键驱动,但是查询方式太占用CPU,接下来利用中断方式编写一个驱动程序,使得CPU占有率降低,在按键空闲时调用read系统调用的进程可以 ...
- android 隐藏虚拟按钮栏及标题等权限设置
华为手机有虚拟按钮,根据以下设置方法可以进行隐藏控制 /** * 隐藏虚拟按键,并且全屏 */ protected void hideBottomUIMenu(Context context){ if ...
- python 常用标准库
标准库和第三方库第一手资料: 在线: 官方文档(https://docs.python.org/) 离线:交互式解释器(dir().help()函数),IPython(tab键提示.?.??) 一. ...
- UNION 和 UNION ALL 操作符
SQL UNION 操作符 1.UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意:UNION 内部的 SELECT 语句必须拥有相同数量的列.列也必须拥有相似的数据类型.同时 ...