zoukankan      html  css  js  c++  java
  • 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         });

    处理过的代码如下:
     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         //这里做判断,如果登录请求返回的是失败,那么直接调用Observable.error()抛出特定类型的异常
     8                 if (!loginResponseInfo.isSucceed()){
     9                     return Observable.error(new InvalidParameterException());
    10                 }
    11                 String authorization ="Bearer " + Base64.encodeToString(loginResponseInfo.getData().getToken().getBytes("UTF-8"), Base64.NO_WRAP);
    12         
    13                 return RecordApplication.getRetrofit().create(ApiService.class)
    14                         .getUserInfo(authorization);
    15             }
    16         }).observeOn(AndroidSchedulers.mainThread())
    17         .subscribe(new Observer<UserDetailInfo>() {
    18             @Override
    19             public void onSubscribe(Disposable d) {
    20 
    21             }
    22 
    23             @Override
    24             public void onNext(UserDetailInfo info) {
    25                 if (info.isSucceed()) {
    26                     Bundle bundle = new Bundle();
    27                     bundle.putParcelable("userInfo", info.getData());
    28                     startActivity(new Intent(LoginActivity.this, HomeActivity.class).putExtras(bundle));
    29                     Toast.makeText(LoginActivity.this, "登录成功", Toast.LENGTH_SHORT).show();
    30                 } else {
    31                     Toast.makeText(LoginActivity.this, "网络异常,请稍后再试", Toast.LENGTH_SHORT).show();
    32                 }
    33             }
    34 
    35             @Override
    36             public void onError(Throwable e) {
    37         // 然后根据刚刚定义的异常类型判断具体是哪个请求抛出的异常
    38                 if (e instanceof InvalidParameterException){
    39                 Toast.makeText(LoginActivity.this, "用户名或密码错误,请重试", Toast.LENGTH_SHORT).show();
    40                 }else{
    41                     Toast.makeText(LoginActivity.this, "网络异常,请稍后再试", Toast.LENGTH_SHORT).show();
    42                 }
    43             }
    44 
    45             @Override
    46             public void onComplete() {
    47 
    48             }
    49         });

     处理的核心就是在第二次请求前用Observer.error()抛出第一次请求的异常,一旦第一次请求失败(我们认为的失败),那么不会进行第二次请求,直接会在Observer的回调中调用onError方法,

    我们根据异常类型判断,如果是我们定义的特定异常,那么就说明第一次请求是失败的,异常在这里得到处理,后续请求不会再进行了.

  • 相关阅读:
    [LintCode] Longest Substring Without Repeating Characters
    [LeetCode] 416. Partition Equal Subset Sum 相同子集和分割
    [LintCode] Reverse Linked List 倒置链表
    [LintCode] Median of Two Sorted Arrays 两个有序数组的中位数
    [LeetCode] 415. Add Strings 字符串相加
    [LintCode] Longest Consecutive Sequence 求最长连续序列
    [LeetCode] 411. Minimum Unique Word Abbreviation 最短的独一无二的单词缩写
    [LeetCode] 410. Split Array Largest Sum 分割数组的最大值
    [LeetCode] Longest Palindrome 最长回文串
    [LeetCode] Valid Word Abbreviation 验证单词缩写
  • 原文地址:https://www.cnblogs.com/fuyaozhishang/p/8697404.html
Copyright © 2011-2022 走看看