【Android】RxJava的使用(二)Action

news/2023/12/9 18:53:50

回顾

在上一节Android RxJava的使用(一)基本用法中,介绍了RxJava的基本用法。下面来回顾下实现一次RxJava的基本使用。
例:分别打印"Hello"、" World"

        Observable.just("Hello", "World")
                .subscribe(new Subscriber<String>() {
                    @Override
                    public void onCompleted() {
                        
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(String s) {
                        Log.i(TAG, s);
                    }
                });

可以看到,我们这里只用了onNext(obj),还有两个重写的onError(error)和onCompleted()并没有用到,这样导致我们多出了几行根本用不到的代码。于是就想能不能只写我们使用到的,其他几个没用到的就不写,这样的代码看着才舒服。接下来就是使用本次的主角Action来代替Subscriber

Action

上部分的代码使用Action来代替Subscriber得到的代码是这样的:

        Observable.just("Hello", "World")
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {
                        Log.i(TAG, s);
                    }
                });

舒服多了有没有!!

  • 什么是Action

Action是RxJava 的一个接口,常用的有Action0和Action1。

Action0: 它只有一个方法 call(),这个方法是无参无返回值的;由于 onCompleted() 方法也是无参无返回值的,因此 Action0 可以被当成一个包装对象,将 onCompleted() 的内容打包起来将自己作为一个参数传入 subscribe() 以实现不完整定义的回调。
Ation1:它同样只有一个方法 call(T param),这个方法也无返回值,但有一个参数;与 Action0 同理,由于 onNext(T obj) 和 onError(Throwable error) 也是单参数无返回值的,因此 Action1 可以将 onNext(obj)和 onError(error) 打包起来传入 subscribe() 以实现不完整定义的回调
  • Action的使用

定义三个对象,分别打包onNext(obj)、onError(error) 、onCompleted()。

        Observable observable = Observable.just("Hello", "World");
        //处理onNext()中的内容
        Action1<String> onNextAction = new Action1<String>() {
            @Override
            public void call(String s) {
                Log.i(TAG, s);
            }
        };
        //处理onError()中的内容
        Action1<Throwable> onErrorAction = new Action1<Throwable>() {
            @Override
            public void call(Throwable throwable) {

            }
        };
        //处理onCompleted()中的内容
        Action0 onCompletedAction = new Action0() {
            @Override
            public void call() {
                Log.i(TAG, "Completed");

            }
        };

接下来使用subscribe重载的方法

//使用 onNextAction 来定义 onNext()
Observable.just("Hello", "World").subscribe(onNextAction);
//使用 onNextAction 和 onErrorAction 来定义 onNext() 和 onError()
Observable.just("Hello", "World").subscribe(onNextAction, onErrorAction);
//使用 onNextAction、 onErrorAction 和 onCompletedAction 来定义 onNext()、 onError() 和 onCompleted()
Observable.just("Hello", "World").subscribe(onNextAction, onErrorAction, onCompletedAction);

根据实际情况使用以上的方法处理onNext(obj)、onError(error) 、onCompleted()的回调。
现在有个疑问,为什么使用Action也能达到使用Subscriber的结果?进subscribe(Action1 onNext)的源码看看。
RxJava源码
还以为有多高深,原来就是把Action对象转化成对应的Subscriber对象了。这样就不难理解为什么可以使用Action来代替Subscriber了。

  • 重新写打印"Hello"、" Wrod"的方法
        Observable.just("Hello", "Wrold").subscribe(new Action1<String>() {
            @Override
            public void call(String s) {
                Log.i(TAG, s);
            }
        });

相比第一篇那冗长的代码,现在感觉怎么样?还是觉得代码多?确实,如果只是打印几个字符串确实还是略微复杂。不急,RxJava还有其他功能呢。

小结

Action的使用为我们减少了不必要的代码,使得写出的代码看上去更加得简洁。不过就目前来看RxJava还是没有什么优势值得我们去使用,下一篇我还会介绍更多RxJava的用法。慢慢得,你就会发现使用RxJava写出来的代码看上去真的很漂亮。
更多:
更多:
Android RxJava的使用(三)转换(map、flatMap)
Android RxJava的使用(四)线程控制 —— Scheduler

以上有错误之处感谢指出

参考:给 Android 开发者的 RxJava 详解
(本文部分内容引用自该博客)


http://www.niftyadmin.cn/n/1968133.html

相关文章

网站优化中等见的问题

随着互联网用户搜索习性的变更&#xff0c;搜索引擎网站算法也在发生着变更&#xff0c;对于网站优化担任职务的人来说&#xff0c;网站的SEO优化办法一样要施行变更。下边列举几种在网站优化过程中常常会碰到的问题。网站关键词部署问题&#xff1a;假如将一个网站关键词在页面…

【scala】3.数组相关操作

2019独角兽企业重金招聘Python工程师标准>>> 简介 在本章中&#xff0c;我们将会学到如何在scala中操作数组。 1、定长数组 // 初始化长度为10的定长数组&#xff0c;每一个元素的值为0 val nums new Array[Int](10) // nums: Array[Int] Array(0, 0, 0, 0, 0, 0,…

Windows上Python2与Python3 共存

我开通了公众号【智能制造专栏】&#xff0c;以后技术类文章会发在专栏。谢谢关注关于Windows平台上Python2与Python3共存&#xff0c;使用过程中可能会遇到一些问题。关于网上其他的修改python.exe名字的做法都是不合适的。下面是我从网上搜集过来的正确使用方法&#xff0c;可…

一种自顶而下的Python装饰器设计方法

本文首发于我的个人博客&#xff0c;更多 Python、django 和 Vue 的开发教程&#xff0c;请访问 追梦人物的博客。 装饰器是 Python 的一种重要编程实践&#xff0c;然而如果没有掌握其原理和适当的方法&#xff0c;写 Python 装饰器时就可能遇到各种困难。犹记得当年校招时应聘…

Mumu模拟器连接adb

2019独角兽企业重金招聘Python工程师标准>>> 【win版】 adb connect 127.0.0.1:7555 adb shell 【mac版】 adb kill-server && adb server && adb shell 转载于:https://my.oschina.net/sfshine/blog/3014484

Web前端开发技术综述

1.1Web概述 1.Web起源: 1984年蒂姆伯纳斯李创造了世界上第一个万维网导航站点世界上第一个网站 2.Web的特点&#xff1a; 1.易导航和图形化界面 2.与平台无关 3.分布式结构 4.动态性 5.交互性 3.Web工作原理&#xff1a; 4.关于URL&#xff1a; URL统一资源定位器可以理解为…

再次简单明了总结flex布局,一看就懂...

思维导图 flex 布局 类型 display: flex;(本文章为此为主) display&#xff1b;inline-flex;属性 父节点 容器flex-container 子节点 flex-item父节点容器 flex-direction 主轴方向(一般水平方向)flex-warp 处理一行排列不足的问题flex-flow …

mysql_connect()不支持请检查mysql模块是否正确加载

解决办法&#xff1a;查看/usr/lib/php/modules/ &#xff08;64位的看/usr/lib64/php/modules/&#xff09;里面根本没有mysql.so安装&#xff1a;php-mysql-5.1.6-20.el5.i386.rpmphp-pdo-5.1.6-20.el5.i386.rpm再查看相应路径&#xff1a;发现有了对应的so文件添加到配置&a…

前嗅ForeSpider教程:抽取数据

今天&#xff0c;小编为大家带来的教程是&#xff1a;如何在前嗅ForeSpider中抽取数据。主要内容包括&#xff1a;如何选择表单&#xff0c;如何采集列表/表格数据两大部分。具体内容如下&#xff1a; 一&#xff0c;如何选择表单 在ForeSpider爬虫中&#xff0c;表单是可以复用…

企业开发中选择logback而不是log4j的理由

不知道看到这篇文章的Java工程师有没有考虑过这个问题&#xff1a;为什么在企业开发中会选择logback来记录日志&#xff0c;而不是log4j呢&#xff1f; 如果你以前没有考虑过这个问题&#xff0c;那么现在如果让你考虑一下&#xff0c;你可能觉的会是因为什么原因呢&#xff1f…

Flutter采坑之路 Run Configuration error:broken configuration due to unavailable

今天把AndroidStudio升级成了3.3.1 原先还能编译成功的Flutter工程突然连编译都不行了&#xff0c; 错误是 Run Configuration error:broken configuration due to unavailable 其原因是Flutter还停留在原先3.2.1的版本上&#xff0c;这个插件是和AS版本走的&#xff0c;所以升…

理解CSS中的数学表达式calc()

前面的话 数学表达式calc()是CSS中的函数&#xff0c;主要用于数学运算。使用calc()为页面元素布局提供了便利和新的思路。本文将介绍calc()的相关内容 定义 数学表达式calc()是calculate计算的缩写&#xff0c;它允许使用、-、*、/这四种运算符&#xff0c;可以混合使用%、px、…

Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)

照例附上项目github链接 本项目实现的是将一个简单的天气预报系统一步一步改造成一个SpringCloud微服务系统的过程&#xff0c;本节主要讲的是通过引入Quartz实现天气数据的同步。 存在问题 当用户请求我们的数据的时候才去拉最新的数据&#xff0c;并将其更新到Redis缓存中&am…

mysql处理中文

CREATE DATABASE db_name DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;转载于:https://blog.51cto.com/maorui2005/1771622

ETM: “黄金时代”不会结束,而是重启

在《希腊的黄金时代》一书中&#xff0c;作者W杜兰认为&#xff0c;雅典的民主政治“是历史上最狭隘也是最充实的&#xff1a;最狭隘&#xff0c;系指其享受民主权利的人数之少&#xff0c;最充实&#xff0c;是谓全体公民在管制立法及治理公众事务上的直接与平等权利”。 曾经…

深入理解Python中的__builtin__和__builtins__

0.说明 这里的说明主要是以Python 2.7为例&#xff0c;因为在Python 3中&#xff0c;__builtin__模块被命名为builtins&#xff0c;下面主要是探讨Python 2.x中__builtin__模块和__builtins__模块的区别和联系。 1.名称空间&#xff08;Namespace&#xff09; 首先不得不说名称…
最新文章