使用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. 转:vscode中调试php

    转:http://blog.csdn.net/x356982611/article/details/52664334 简介 PHP是动态语言没有调试器的话排错起来很是麻烦.vscode可以说是程序员的 ...

  2. 【枚举】XVII Open Cup named after E.V. Pankratiev Stage 4: Grand Prix of SPb, Sunday, Octorber 9, 2016 Problem D. Cutting Potatoes

    题意:有n个土豆,每个有体积V(i),你可以将每个土豆等分为不超过K份,问你最大块和最小块比值最小为多少. 直接枚举切法,只有n*K种,然后保证其为最大块,去算其他块的切法,即让其他块切得尽可能大即可 ...

  3. 【c++随手记】编程基础之输入输出

    今天试了下noi oj的1.1节,随便总结一下. [cout左对齐右对齐的方法] #include<iostream> #include<cstdio> #include< ...

  4. java.lang.RuntimeException: com.intellij.ide.plugins.PluginManager

    描述: 在mac电脑上的Android Studio.因为项目需求,加载plugins中的dart和Flutter插件.经过***后,依然无法从AS中加载进来. 曲折到Jetbrains官网下载了da ...

  5. 安装配置convirture

    Author: Jin Date: 20130627 Title: 安装配置convirture 参考: http://www.convirture.com/wiki/index.php?title= ...

  6. GG同步到sqlserver报错一例 Invalid date format

    在将Oracle表同步到sqlserver时,在sqlserver端应用数据时,可能会遇到这个报错. 2014-05-17 17:20:24 WARNING OGG-01154 SQL error - ...

  7. js禁止复制粘贴

    1. oncontextmenu="window.event.returnValue=false" 将彻底屏蔽鼠标右键,其实是禁止快捷菜单,因为不光右键可以弹出这个菜单,键盘上空格 ...

  8. Android记一次后台保活设计心得2018

    首先我并不推荐也不喜欢手机应用通过各种手段后台保活,但是当产品经理确定一定以及肯定地提出了这个需求,活着应用有着必须常驻后台的理由,也就只有硬着头皮去与各个手机的后台管理机制做斗争了. 背景:因为开发 ...

  9. Nao 类人机器人,Aldebaran Robotics公司

    Nao 类人机器人,Aldebaran Robotics 公司,被SOFTBANK 收购,阿里巴巴.富士康参股. https://www.aldebaran.com/en   一家法国的公司. htt ...

  10. humanoid ik unity 配件 animation的问题

    遇到这样一个问题 想给角色设置ik 以实现代码控制的 更为自然的 角色动作 比如角色头跟随点击转动 身体也有相应扭转 https://docs.unity3d.com/Manual/InverseKi ...