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练习-生成器、迭代器-2018.12.01
如果列表元素可以按照某种算法推算出来,可以在循环的过程中不断推算出后续的元素.这样就不必创建完整的list,从而节省大量的空间.在Python中,这种一边循环一边计算的机制,称为生成器:generat ...
- Quartz.NET快速入门指南
最近,在工作中遇到了 Quartz.net 这个组件,为了更好的理解项目代码的来龙去脉,于是决定好好的研究一下这个东西.确实是好东西,既然是好东西,我就拿出来分享一下.万丈高楼平地起,我们也从入门开始 ...
- C语言输出格雷码
格雷码是以n位的二进制来表示数. 与普通的二进制表示不同的是,它要求相邻两个数字只能有1个数位不同. 首尾两个数字也要求只有1位之差. 有很多算法来生成格雷码.以下是较常见的一种: 从编码全0开始生成 ...
- css属性及定位操作
字体属性 文字字体 font-family可以把多个字体名称作为一个“回退”系统来保存.如果浏览器不支持第一个字体,则会尝试下一个.浏览器会使用它可识别的第一个值. 简单实例: body { font ...
- Spring Boot-右键maven build成功但是直接运行main方法出错的解决方案
1.代码就一个Controller,从官网复制过来的,如下 package com.springboot.controller; import org.springframework.boot.Spr ...
- php上传多张图片
第一种:加后缀 代码实现(就是普通的上传图片,只是在外面加个foreach循环) $allow_file_types = '|GIF|JPG|PNG|BMP|SWF|DOC|XLS|PPT|MID|W ...
- nginx配置备忘
一.本地测试环境配置 upstream gongsibao{ server ; server ; #fair; } server { listen ; server_name ubuntu00.xus ...
- maven解决omitted for duplicate(依赖冲突)
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring- ...
- 201771010142 张燕《面向对象程序设计(java)》第一周学习总结
201771010142 张燕<面向对象程序设计(java)>第一周学习总结 第一部分:课程准备部分 填写课程学习 平台注册账号, 平台名称 注册账号 博客园:www.cnblogs.co ...
- ubuntu16.04 下安装 visual studio code 以及利用 g++ 运行 c++程序
参考链接:1. http://www.linuxidc.com/Linux/2016-07/132798.htm(安装vs code) 2.https://blog.csdn.net/qq_28598 ...