Rxjava2.0 链式请求异常处理
使用Rxjava2.0的过程中,难免会遇到链式请求,而链式请求一般都是第一个抛异常,那么后面的请求都是不会走的.现在来讨论一下链式请求的一种异常处理方法.
例如: 一个登录-->通过登录返回的token数据-->获取用户相关信息的链式请求
未处理代码如下:
1 retrofit.create(ApiService.class)
2 .login(userName, pwd)
3 .subscribeOn(Schedulers.io())
4 .flatMap(new Function<LoginResponseInfo, ObservableSource<UserDetailInfo>>() {
5 @Override
6 public ObservableSource<UserDetailInfo> apply(LoginResponseInfo loginResponseInfo) throws Exception {
7
8 String authorization ="Bearer " + Base64.encodeToString(loginResponseInfo.getData().getToken().getBytes("UTF-8"), Base64.NO_WRAP);
9
10 return retrofit.create(ApiService.class)
11 .getUserInfo(authorization);
12 }
13 }).observeOn(AndroidSchedulers.mainThread())
14 .subscribe(new Observer<UserDetailInfo>() {
15 @Override
16 public void onSubscribe(Disposable d) {
17
18 }
19
20 @Override
21 public void onNext(UserDetailInfo info) {
22 if (info.isSucceed()) {
23 Bundle bundle = new Bundle();
24 bundle.putParcelable("userInfo", info.getData());
25 startActivity(new Intent(LoginActivity.this, HomeActivity.class).putExtras(bundle));
26 Toast.makeText(LoginActivity.this, "登录成功", Toast.LENGTH_SHORT).show();
27 } else {
28 Toast.makeText(LoginActivity.this, "网络异常,请稍后再试", Toast.LENGTH_SHORT).show();
29 }
30 }
31
32 @Override
33 public void onError(Throwable e) {
34 //这里的异常根本不知道是如何处理
35 Toast.makeText(LoginActivity.this, "未知异常", Toast.LENGTH_SHORT).show();
36
37 }
38
39 @Override
40 public void onComplete() {
41
42 }
43 });
处理过的代码如下:
retrofit.create(ApiService.class)
.login(userName, pwd)
.subscribeOn(Schedulers.io())
.flatMap(new Function<LoginResponseInfo, ObservableSource<UserDetailInfo>>() {
@Override
public ObservableSource<UserDetailInfo> apply(LoginResponseInfo loginResponseInfo) throws Exception {
//这里做判断,如果登录请求返回的是失败,那么直接调用Observable.error()抛出特定类型的异常
if (!loginResponseInfo.isSucceed()){
return Observable.error(new InvalidParameterException());
}
String authorization ="Bearer " + Base64.encodeToString(loginResponseInfo.getData().getToken().getBytes("UTF-8"), Base64.NO_WRAP); return RecordApplication.getRetrofit().create(ApiService.class)
.getUserInfo(authorization);
}
}).observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<UserDetailInfo>() {
@Override
public void onSubscribe(Disposable d) { } @Override
public void onNext(UserDetailInfo info) {
if (info.isSucceed()) {
Bundle bundle = new Bundle();
bundle.putParcelable("userInfo", info.getData());
startActivity(new Intent(LoginActivity.this, HomeActivity.class).putExtras(bundle));
Toast.makeText(LoginActivity.this, "登录成功", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(LoginActivity.this, "网络异常,请稍后再试", Toast.LENGTH_SHORT).show();
}
} @Override
public void onError(Throwable e) {
// 然后根据刚刚定义的异常类型判断具体是哪个请求抛出的异常
if (e instanceof InvalidParameterException){
Toast.makeText(LoginActivity.this, "用户名或密码错误,请重试", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(LoginActivity.this, "网络异常,请稍后再试", Toast.LENGTH_SHORT).show();
}
} @Override
public void onComplete() { }
});
处理的核心就是在第二次请求前用Observer.error()抛出第一次请求的异常,一旦第一次请求失败(我们认为的失败),那么不会进行第二次请求,直接会在Observer的回调中调用onError方法,
我们根据异常类型判断,如果是我们定义的特定异常,那么就说明第一次请求是失败的,异常在这里得到处理,后续请求不会再进行了.
Rxjava2.0 链式请求异常处理的更多相关文章
- 谈谈MVVM和链式网络请求架构
前言 前一段时间一直在学习iOS的架构.为什么呢? 公司的架构一直是MVC,当我们正式上线的时候,项目已经有了超十万行代码.主要的VC一般都有2000行代码以上. 关键是,目前版本我们只做了三分之一的 ...
- 使用Retrofit2+RxJava2+ProtoBuf实现网络请求
引言 Retrofit 是一个用于 Android 和 Java 平台的类型安全的,底层使用OkHttp实现网络请求框架.Retrofit 通过将 API 抽象成 Java 接口而让我们连接到 RES ...
- RxJava2.0的使用详解
RxJava2.0的使用详解 1,初识RxJava RxJava就是一种用Java语言实现的响应式编程,来创建基于事件的异步程序 RxJava是一个基于事件订阅的异步执行的一个类库,目前比较火的一些技 ...
- swift学习笔记之-可选链式调用
//可选链式调用 import UIKit /*可选链式调用(Optional Chaining) 1.在可选值上请求和调用该可选值的属性.方法及下标的方法,如果可选值有值,那么调用就会成功,返回可选 ...
- C语言 队列 链式结构 实现
一个C语言链式结构实现的队列 mQueue (GCC编译). /** * @brief C语言实现的链式队列 * @author wid * @date 2013-10-31 * * @note 若代 ...
- Swift-09-可空链式调用(Optional Chaining)
我对这个的理解就是:我们有可能会用到其他的属性或者方法,当我们在使用其他的时候,可以使用点语法去访问另一个的属性,这样的使用,就形成了链式访问. 可空链式调用是一种可以请求和调用属性.方法及下表的过程 ...
- 数据结构Java实现03----栈:顺序栈和链式堆栈
一.堆栈的基本概念: 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除 ...
- Bytom的链式交易和花费未确认的交易
当我们基于比原做应用的时候,在构建交易过程中会遇到以下两种情况.多个地址向一个地址转账,还有一种就是从一个地址分批次向多个地址转账.那我们今天就来介绍一下这两种交易构建的具体流程,以及贴出具体实现的代 ...
- swift 学习- 19 -- 可选链式调用
// 可选链式调用 是一种在当前值可能为 nil 的可选值上请求 和 调用属性, 方法以及下标, 如果 可选值有值, 那么调用就会成功, 如果可选值是 nil, 那么就会将返回 nil , // 多个 ...
随机推荐
- 关于hadoop处理大量小文件情况的解决方法
小文件是指那些size比HDFS的block size(默认64m)小的多的文件.任何一个文件,目录和bolck,在HDFS中都会被表示为一个object存储在namenode的内存中,每一个obje ...
- 链式前向星实现的堆优化dij求最短路模板
#include<cstdio> #include<string> #include<cstdlib> #include<cmath> #include ...
- CodeForces 738A Interview with Oleg
模拟. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #includ ...
- go chapter 1
case 1 // helloworld.go package main import "fmt" func main() { fmt.Println("Hello, 世 ...
- 并发系列5-大白话聊聊Java并发面试问题之微服务注册中心的读写锁优化【石杉的架构笔记】
- Flask实战第43天:把图片验证码和短信验证码保存到memcached中
前面我们已经获取到图片验证码和短信验证码,但是我们还没有把它们保存起来.同样的,我们和之前的邮箱验证码一样,保存到memcached中 编辑commom.vews.py .. from utils i ...
- Oracle关于锁的几种类型和参数
设立封锁机制主要是为了对并发操作进行控制,对干扰进行封锁,保证数据的一致性和准确性.Oracle数据库封锁方式有三种:共享封锁,独占封锁,共享更新封锁 封锁类型 Oracle RDBMS的封锁类型可分 ...
- Spring 概念详解
一.Spring的IoC(Inversion of Control). 这是Spring中得有特点的一部份.IoC又被翻译成“控制反转”,也不知道是谁翻译得这么别扭,感觉很深奥的词.其实,原理很简单, ...
- linux基础环境搭建(2)
打开虚拟机,用Xshell连接之前,首先我们要获取IP的地址 先输入获取 IP的命令 ip addr 获取ipifup (网卡名字) #网卡启动ifdown (网卡名字) #网卡关闭 没有获取到的 ...
- TCP,UDP,IP总结
一.传输层的主要功能是什么? 分割并重新组装上层提供的数据流,为数据流提供端到端的传输服务. 二.传输层如何区分不同应用程序的数据流? 因为,对应传输层而言,它只需要知道目标主机上的哪个服务程序来响应 ...