使用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 链式请求异常处理的更多相关文章

  1. 谈谈MVVM和链式网络请求架构

    前言 前一段时间一直在学习iOS的架构.为什么呢? 公司的架构一直是MVC,当我们正式上线的时候,项目已经有了超十万行代码.主要的VC一般都有2000行代码以上. 关键是,目前版本我们只做了三分之一的 ...

  2. 使用Retrofit2+RxJava2+ProtoBuf实现网络请求

    引言 Retrofit 是一个用于 Android 和 Java 平台的类型安全的,底层使用OkHttp实现网络请求框架.Retrofit 通过将 API 抽象成 Java 接口而让我们连接到 RES ...

  3. RxJava2.0的使用详解

    RxJava2.0的使用详解 1,初识RxJava RxJava就是一种用Java语言实现的响应式编程,来创建基于事件的异步程序 RxJava是一个基于事件订阅的异步执行的一个类库,目前比较火的一些技 ...

  4. swift学习笔记之-可选链式调用

    //可选链式调用 import UIKit /*可选链式调用(Optional Chaining) 1.在可选值上请求和调用该可选值的属性.方法及下标的方法,如果可选值有值,那么调用就会成功,返回可选 ...

  5. C语言 队列 链式结构 实现

    一个C语言链式结构实现的队列 mQueue (GCC编译). /** * @brief C语言实现的链式队列 * @author wid * @date 2013-10-31 * * @note 若代 ...

  6. Swift-09-可空链式调用(Optional Chaining)

    我对这个的理解就是:我们有可能会用到其他的属性或者方法,当我们在使用其他的时候,可以使用点语法去访问另一个的属性,这样的使用,就形成了链式访问. 可空链式调用是一种可以请求和调用属性.方法及下表的过程 ...

  7. 数据结构Java实现03----栈:顺序栈和链式堆栈

    一.堆栈的基本概念: 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除 ...

  8. Bytom的链式交易和花费未确认的交易

    当我们基于比原做应用的时候,在构建交易过程中会遇到以下两种情况.多个地址向一个地址转账,还有一种就是从一个地址分批次向多个地址转账.那我们今天就来介绍一下这两种交易构建的具体流程,以及贴出具体实现的代 ...

  9. swift 学习- 19 -- 可选链式调用

    // 可选链式调用 是一种在当前值可能为 nil 的可选值上请求 和 调用属性, 方法以及下标, 如果 可选值有值, 那么调用就会成功, 如果可选值是 nil, 那么就会将返回 nil , // 多个 ...

随机推荐

  1. oracle常用函数整理

    oracle常用函数整理    1.绝对值.取余.判断数值正负函数    绝对值:ABS(n)        示例: SELECT ABS(100),ABS(-100),ABS('100') FROM ...

  2. NIO使用Reactor模式遇到的问题

    关于Reactor模式,不再多做介绍,推荐Doug Lea大神的教程:Java 可扩展的IO 本来在Reactor的构造方法中完成一系列操作是没有问题的: public class Reactor i ...

  3. 洛谷——P1014 Cantor表

    P1014 Cantor表 题目描述 现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的.他是用下面这一张表来证明这一命题的: 1/1 1/2 1/3 1/4 1/5 … 2/1 ...

  4. 查看所有shell类型

    [xf@xuexi ~]$ cat /etc/shells /bin/sh /bin/bash /sbin/nologin /usr/bin/sh /usr/bin/bash /usr/sbin/no ...

  5. JZYZOJ 1385 拉灯游戏 状态压缩 搜索

    http://172.20.6.3/Problem_Show.asp?id=1385   刚开始想的时候一直以为同一排不同的拉灯顺序对结果是有影响的,手推了好多遍才发现拉灯结果只和拉的灯有关,这也要打 ...

  6. Codeforces 961E 主席树

    题意: 给出一个n个数的序列,求有几对(i,j)满足a[i]>=j&&a[j]>=i,(i,j)和(j,i)只能算一对. 考虑第i个数会有几个j(j<i)满足条件,首 ...

  7. 【bzoj1594】猜数游戏

    1594: [Usaco2008 Jan]猜数游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 556  Solved: 225 Descripti ...

  8. 交换x,y的三种方式

    1 值传递: #include<iostream> using namespace std; int main(){ void change(int ,int); int x=2,y=3; ...

  9. for of 与 for in的区别2

    遍历数组通常使用for循环,ES5的话也可以使用forEach,ES5具有遍历数组功能的还有map.filter.some.every.reduce.reduceRight等,只不过他们的返回结果不一 ...

  10. Mac OS X 11年9个版本的历经变化

    本月苹果将发布OS X 10.8 Mountain Lion,是Mac OS X系统在其11年生命长河中的第9个版本.2001年,刚从鬼门关爬回来的苹果决定在OS X上做一个赌注,因为他们已经浪费了1 ...