Android笔记之Retrofit与RxJava的组合
依赖
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.5.0'
implementation 'io.reactivex.rxjava2:rxjava:2.2.8'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
Retrofit版本2.5.0
RxJava版本2.2.8
converter-gson:用于将来自服务端的json数据转换为Java对象
adapter-rxjava:用于实现Retrofit和RxJava的组合
rxandroid:用于使用AndroidSchedulers.mainThread()
示例
EyeKeyService.java
package com.bu_ish.retrofitrxjava; import io.reactivex.Single;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST; public interface EyeKeyService {
String BASE_URL = "http://api.eyekey.com/face/";
String APP_ID = "f89ae61fd63d4a63842277e9144a6bd2";
String APP_KEY = "af1cd33549c54b27ae24aeb041865da2"; @FormUrlEncoded
@POST("Check/checking")
Single<FaceCheckingReply> checkFace(@Field("app_id") String appId, @Field("app_key") String appKey, @Field("url") String url);
}
MainActivity.java
package com.bu_ish.retrofitrxjava; import android.app.ProgressDialog;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View; import io.reactivex.SingleObserver;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory; public class MainActivity extends AppCompatActivity {
private ProgressDialog pdHttpRequest;
private EyeKeyService service; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pdHttpRequest = new ProgressDialog(this);
pdHttpRequest.setCancelable(false);
findViewById(R.id.btnCheckFace).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String picUrl = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1554372634204&di=a4804907c80d38d4997291e0cb546f71&imgtype=0&src=http%3A%2F%2Fi1.sinaimg.cn%2Fent%2F2011%2F1012%2FU3593P28DT20111012165707.jpg";
service.checkFace(EyeKeyService.APP_ID, EyeKeyService.APP_KEY, picUrl)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SingleObserver<FaceCheckingReply>() {
@Override
public void onSubscribe(Disposable d) {
pdHttpRequest.show();
} @Override
public void onSuccess(FaceCheckingReply faceCheckingReply) {
pdHttpRequest.dismiss();
String code = faceCheckingReply.getResCode();
if (code.equals("0000")) {
String faceId = faceCheckingReply.getFaces().get(0).getFaceId();
new AlertDialog.Builder(MainActivity.this).setTitle("Face Id").setMessage(faceId).show();
} else {
new AlertDialog.Builder(MainActivity.this).setTitle(code).setMessage(faceCheckingReply.getMessage()).show();
}
} @Override
public void onError(Throwable e) {
pdHttpRequest.dismiss();
new AlertDialog.Builder(MainActivity.this).setTitle("Error").setMessage(e + "").show();
}
});
}
});
service = new Retrofit.Builder()
.baseUrl(EyeKeyService.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build()
.create(EyeKeyService.class);
}
}
其中的addConverterFactory(GsonConverterFactory.create())用于实现json转换为Java对象
若不添,则抛出如下异常
Caused by: java.lang.IllegalArgumentException: Could not locate ResponseBody converter for class com.bu_ish.retrofitrxjava.FaceCheckingReply.
addCallAdapterFactory(RxJava2CallAdapterFactory.create())用于实现将EyeKeyService中的函数类型设定为RxJava中的被观察者类型
若不添,则抛出如下异常
Caused by: java.lang.IllegalArgumentException: Could not locate call adapter for io.reactivex.Single<com.bu_ish.retrofitrxjava.FaceCheckingReply>.
subscribeOn(Schedulers.io())用于把网络请求切换至子线程
若不添,则抛出异常NetworkOnMainThreadException
observeOn(AndroidSchedulers.mainThread())用于指定在主线程中处理服务端的响应数据

参考博文:RxJava线程切换——ObserveOn和SubscribeOn的区别
Android笔记之Retrofit与RxJava的组合的更多相关文章
- Android okHttp网络请求之Retrofit+Okhttp+RxJava组合
前言: 通过上面的学习,我们不难发现单纯使用okHttp来作为网络库还是多多少少有那么一点点不太方便,而且还需自己来管理接口,对于接口的使用的是哪种请求方式也不能一目了然,出于这个目的接下来学习一下R ...
- 82.Android之MVP+Retrofit+RxJava实践小结
转载:http://wuxiaolong.me/2016/06/12/mvpRetrofitRxjava/ 关于MVP.Retrofit.RxJava,之前已经分别做了分享,如果您还没有阅读过,可以猛 ...
- Retrofit结合RxJava使用指南
Retrofit结合RxJava使用指南 Retrofit是一个当前很流行的网络请求库, 官网的介绍是: "Type-safe HTTP client for Android and Jav ...
- Retrofit与RXJava整合
Retrofit 除了提供了传统的 Callback 形式的 API,还有 RxJava 版本的 Observable 形式 API.下面我用对比的方式来介绍 Retrofit 的 RxJava 版 ...
- 使用Retrofit和RxJava
使用Retrofit和RxJava整合访问网络,然后将数据显示到界面上 def retrofitVersion = '2.0.0-beta1' dependencies { compile fileT ...
- Retrofit+Okhttp+RxJava打造网络请求之Post
之前一直在准备Android培训的事情,所幸的是终于完事啦,在这过程中真的发现了自身无论从沟通能力还是技术能力上很多的不足,就用一句 路漫漫其修远兮,吾将上下而求索 来勉励自己吧.之前也在项目上用上O ...
- Retrofit与RXJava整合(转)
Retrofit 除了提供了传统的 Callback 形式的 API,还有 RxJava 版本的 Observable 形式 API.下面我用对比的方式来介绍 Retrofit 的 RxJava 版 ...
- Flutter学习笔记(38)--自定义控件之组合控件
如需转载,请注明出处:Flutter学习笔记(38)--自定义控件之组合控件 在开始之前想先写点其他的,emm...就是今天在学习到自定义控件的时候,由于自定义控件这块一直是我的短板,无论是Andro ...
- Android笔记——Android中数据的存储方式(二)
我们在实际开发中,有的时候需要储存或者备份比较复杂的数据.这些数据的特点是,内容多.结构大,比如短信备份等.我们知道SharedPreferences和Files(文本文件)储存这种数据会非常的没有效 ...
随机推荐
- POJ 1703 Find them, Catch them 并查集的应用
题意:城市中有两个帮派,输入中有情报和询问.情报会告知哪两个人是对立帮派中的人.询问会问具体某两个人的关系. 思路:并查集的应用.首先,将每一个情报中的两人加入并查集,在询问时先判断一下两人是否在一个 ...
- CMake的应用(在vision studio2008中去掉 ALL_BUILD 和 ZERO_CHECK)
from http://blog.csdn.net/jtop0/article/details/6167432 一般由CMake是 跨平台软件开发和维护过程的 工程构建工具.“在每个系统构建你的工程 ...
- lock与monitor的区别
1.Lock 只能对引用对象加锁 Lock锁定区间内可以对锁定值修改而不发生运行时错误,通常也会采用此种修改方式.这种方式又有点类同于使用Monitor.Wait取得资源,并对这个资源进行操作. 用法 ...
- android windowSoftInputMode属性详解(转)
activity主窗口与软键盘的交互模式,可以用来避免输入法面板遮挡问题,Android1.5后的一个新特性. 这个属性能影响两件事情: [一]当有焦点产生时,软键盘是隐藏还是显示 [二]是否减少活动 ...
- Scut游戏服务器引擎之新手入门
1. 开发语言:Scut提供C#或Python两种脚本语言开发,Python脚本的性能会比较差,建议使用编译执行的C#代码: 2. 运行平台:Scut可以Window与Linux平台上运行,Linux ...
- CentOS 挂载NTFS分区的两种方法
第一种是安装内核模块,可到 http://sourceforge.net/projects/linux-ntfs/files/ 下载,需下载与你系统内核想对应的版本,使用uname -a 查看当前内核 ...
- sublime去除空白行和重复行
去除空白行 edit -> line -> delete blank lines 去除重复行 打开正则模式 1 edit-> sort lines 2 command+option+ ...
- 传输层:UDP 协议
一.传输层协议 从之前介绍的网络层协议来看,通信的两端是两台主机,IP 数据报首部就标明了这两台主机的 IP 地址.但是从传输层来看,是发送方主机中的一个进程与接收方主机中的一个进程在交换数据,因此, ...
- ZRender实现粒子网格动画实战
注:本博文代码基于ZRender 3.4.3版本号开发,相应版本号库地址:ZRender 库. 效果 实现分析 通过上面显示的效果图,能够看出,这样的效果就是在Canvas中生成多个可移动的点,然后依 ...
- Confluence JIRA快速入门
Confluence JIRA快速入门 http://www.confluence.cn/pages/viewpage.action?pageId=2916470