用于改造响应代码处理的自定义 rx Func1

2024-04-02

我是 rxjava 的新手,所以请不要严格......

我请求虱子下一个:

Observable<Login>login(String l, String p){
        return api.loginUser(l,p)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .flatMap(new Func1<Response<Login>, Observable<? extends Login>>() {
                    @Override
                    public Observable<? extends Login> call(Response<Login> r) {
                        switch (r.code()){
                            case 200:
                                requestOk(r);
                                break;
                            case 202:
                                //need to Repeat
                                login.timeout(2000,TimeUnit.Milliseconds);
                                break;
                            default:
                                //
                        }
                    }
                });
    }

Observable<Login> requestOk(final Response<Login> r){
            return Observable.create(new Observable.OnSubscribe<Login>(){
                @Override
                public void call(Subscriber<? super Login> subscriber) {
                    if (subscriber.isUnsubscribed()) return;
                    subscriber.onNext(r.body());
                    subscriber.onCompleted();
                }
            });
        }

工作正常。但是还会有很多其他请求,我需要检查请求代码以防重复。

所以我试图创建自定义 Func1 - 适合所有请求:

private <T>Func1<? super Response<T>, ? extends Observable<? extends T>> customFunc(final Observable<T> o) {
        return new Func1<Response<T>, Observable<? extends T>>() {
            @Override
            public Observable<? extends T> call(Response<T> r) {
                switch (r.code()){
                    case 200:
                        //
                        break;
                    case 202:
                        //need to Repeat
                        return o.timeout(2000,TimeUnit.Milliseconds);
                        break;
                    default:
                        //
                }
            };
        };
    }

我坚持将登录可观察中的当前可观察放入 customFunc 中。

我相信一定有其他更简单、更正确的方法来做到这一点。 会很高兴有任何帮助!


您可以使用Transformer为了创建通用状态代码验证器:

class StatusCodeVerifierTransformer<T> implements Observable.Transformer<Response<T>, T> {

    @Override
    public Observable<T> call(Observable<Response<T>> responseObservable) {
        return responseObservable.flatMap(new Func1<Response<T>, Observable<T>>() {
            @Override
            public Observable<T> call(Response<T> loginResponse) {
                switch (loginResponse.code()) {
                    case 200:
                        return Observable.just(loginResponse.body());
                    case 202:
                        //need to Repeat
                        return Observable.error(new Status202Exception());
                    default:
                        return Observable.error(new Exception("unknown error"));
                }
            }
        });

    }
}

该变压器将采取任何Observable of Response<T>并将其转换为Observable of T,根据您的策略发出错误。
然后将其与compose()操作员:

  Observable<Login> login(String l, String p) {
    return api.loginUser(l, p)
            .compose(new StatusCodeVerifierTransformer<>())
   }

现在你有一个Observable会发出onError根据您的状态代码处理您想要的异常。

现在,您可以像任何错误一样重试错误Observable with retry运算符,例如这样:

 api.loginUser(l, p)
            .compose(new StatusCodeVerifierTransformer<>())
            .retry(new Func2<Integer, Throwable, Boolean>() {
                @Override
                public Boolean call(Integer retryCount, Throwable throwable) {
                    return throwable instanceof Login202Exception && retryCount < MAX_RETRY;
                }
            })

BTW,一些评论:

requestOk - 你绝对不需要创建Observable要发出一次特定值,只需使用just()运算符,就像在StatusCodeVerifierTransformer例子。 (或者对于任何其他同步操作,您有很多运算符,例如fromCallable(), just(), from())
一般来说,create()不是一种安全的创建方法Observable不再了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用于改造响应代码处理的自定义 rx Func1 的相关文章

随机推荐

  • HAProxy 随机空响应

    我安装了 HAPROXY 以实现两台服务器之间的平衡 不幸的是 HAPROXY 返回随机 ERR EMPTY RESPONSE 我也安装了统计信息 但统计信息没有出现频繁地因为有时会显示统计数据 我和一些朋友仔细检查了我的配置 没有发现问题
  • 从提升的子进程获取错误和标准输出

    我创建了一个进程处理程序 它启动两种类型的进程 使用管理员用户名和密码提升的权限 另一种无需输入任何用户名和密码即可正常运行 我正在努力弄清楚如何从提升的进程中获取输出 启动进程的应用程序不需要管理员凭据即可运行 管理员凭据输入到单独的加密
  • Angular2 i18n 用于占位符文本

    有没有办法使用 Angular 2 的 i18n 翻译输入文本字段的占位符文本
  • 从派生类访问基类公共成员

    是否可以从程序中其他位置的派生类实例访问基类公共成员 class base public int x base int xx x xx class derived base public derived int xx base xx cla
  • 从python句子中删除非英语单词

    我编写了一个代码 用于向 Google 发送查询并返回结果 我从这些结果中提取片段 摘要 以进行进一步处理 然而 有时这些片段中会出现我不想要的非英语单词 例如 u02b0w u025bn w u025bn unstressed u02b0
  • 多次按下按钮时声音重叠

    当我按下一个按钮 然后按下另一个按钮时 声音会重叠 我该如何解决这个问题 以便在按下另一个声音时第一个声音停止 void playOnce NSString aSound NSString path NSBundle mainBundle
  • ORA-01840: 输入值对于 Oracle Insert 使用 Select 中的日期格式来说不够长

    我有以下查询 其中出现错误ORA 01840 input value not long enough for date format The C DATE列是日期数据类型 INSERT INTO CS LOG NAME ID C DATE
  • React.PropTypes.func.isRequired 的问题

    我是 React 新手 正在尝试定义 PropTypes 但似乎它不再起作用 以下是我如何使用它 React PropTypes func isRequired Below is the error am getting 那么这就是我所缺少
  • 是否可以检查 CSS 变量是否已定义?

    我想知道是否可以仅在定义了 css 变量的情况下应用 CSS 规则 我已经看到可以定义默认值 例如 background color var bgColor red 但我认为这不会在我的项目中起作用 因为我想要的是 当未定义变量来获取该行在
  • Conda - 从防火墙后面的 .whl 文件安装tensorflow

    我有一个Anaconda3 与 Python 3 6 Spyder 环境 正在尝试安装tensorflow但是 由于公司防火墙的原因 无法使用标准的 pip 安装 此外 出于同样的原因 我无法创建 anaconda 环境 我想做的是直接从安
  • Levene 检验的多重比较事后检验

    我想在 R 中对 Levene 的测试进行成对比较事后测试 我知道如何使用 PROC GLM 在 SAS 中执行此操作 但我似乎不知道如何在 R 中执行此操作 有人有吗主意 在下面的示例中 我希望能够测试所有 猫 级别 即 A B A C
  • Scala 中的无符号变量

    我正在将一些 C 代码转换为 Scala 因为我们正在 据称 进入企业大厦的现代世界 至少我是被告知的 某些 C 代码使用无符号变量 这些变量对其执行了大量位级 移位 操作 我对如何将它们转换为 Scala 完全处于停滞状态 因为我相信 S
  • PrimeFaces。渲染后更新数据表

    我有一个数据表并想要保留过滤器 我可以保存过滤器值并通过调用数据表将它们放回 我将过滤器值放回到渲染中 现在我想要过滤表 是的 我想调用服务并从中获取所有数据 然后我想使用保留在过滤字段中的值来过滤表 我找不到在渲染表格后启动过滤的解决方案
  • 线程可以处理很长的 I/O 进程吗

    我在这里开始一个新主题 该主题将与这个问题 https stackoverflow com questions 47250025 qthreadpool how to interrupt how to use wisely the wait
  • 将 Psyco 移植到 64 位可能存在哪些陷阱?

    心理医生说 仅供参考 Psyco 不 可以在任何 64 位系统上工作 这个事实值得再次注意 现在最新的 Mac OS X 10 6 雪豹 自带默认 64 位上的 64 位 Python 机器 使用 Psyco 的唯一方法 OS X 10 6
  • 在 CSS 中将文本垂直和水平居中在圆圈中(如 iphone 通知徽章)

    我正在寻找一种在 CSS3 中制作类似 iphone 的跨浏览器徽章的方法 我显然想使用一个 div 来实现这一点 但其他解决方案也可以 重要的因素是它需要在所有浏览器中水平和垂直居中 关于这些通知的一个有趣的设计问题是它们不能具有指定的宽
  • 如何解析/proc/pid/cmdline

    我试图在 Linux 上拆分进程的命令行 但似乎我不能依赖它用 0 字符分隔 你知道为什么有时 0 字符用作分隔符而有时它是常规空格吗 您知道检索可执行文件名称及其路径的其他方法吗 我一直在尝试使用 ps 获取此信息 但它总是返回完整的命令
  • C++11 嵌套宏调用?

    它在 C std 16 3 4 中说 生成的预处理标记序列 来自宏调用替换 与源文件的所有后续预处理标记一起重新扫描 以获取更多宏名称 代替 如果在替换列表扫描期间找到了被替换的宏的名称 不包括 源文件的其余预处理标记 它不会被替换 此外
  • Lua 中的“主”函数?

    在 python 中 通常会定义一个 main 函数 以便允许脚本用作模块 如果需要 def main print Hello world return 0 if name main sys exit main 在Lua中 这个习语if n
  • 用于改造响应代码处理的自定义 rx Func1

    我是 rxjava 的新手 所以请不要严格 我请求虱子下一个 Observable