RxJava 1.x 参数和参数的类型
来源:互联网 发布:战龙三国坐骑数据 编辑:程序博客网 时间:2024/06/05 05:41
前面说过,RxJava的数据是不可变的。
RxJava 与面向对象的Java编程不同,面向对象的Java类可以通过类属性和参数两种方式为方法提供业务数据;而RxJava 运行过程中,唯一获取数据的方式是通过参数传递。
一、Observable的三个标注式接口
RxJava 在 Observable 内部定义了三个标注式接口:
public interface OnSubscribe<T> extends Action1<Subscriber<? super T>> {}
public interface Operator<R, T> extends Func1<Subscriber<? super R>, Subscriber<? super T>> {}
public interface Transformer<T, R> extends Func1<Observable<T>, Observable<R>> {}
这三个标注式接口分别继承自Action1和Funcation1接口。
二、RxJava中的标注式接口
RxJava 定义了两种类型的标注式接口,所谓标注式接口(marker interface)是一种不包含任何方法的接口声明。目的仅仅是为了用于类型检查,通过标注式接口的名称,判断和检查参数数量和类型。
1、分类
一种是 Function ,另外一种是 Action:
public interface Function {}public interface Action extends Function {}
2、关系
Function和Action的关系是: Action 继承了 Function接口。
3、区别
Function 的子类包含输入参数的类型和返回参数类型;
public interface Func1<T, R> extends Function { R call(T t);}
Action 的子类只包含输入参数的类型,没有返回值。
public interface Action1<T> extends Action { void call(T t);}
Funcation包括11个子类:
Func0<R>、Func1<T1,R>、Func2<T1,T2,R>、Func3<T1,T2,T3,R>、Func4<T1,T2,T3,T4,R>、Func5<T1,T2,T3,T4,T5,R>、Func6<T1,T2,T3,T4,T5,T6,R>、Func7<T1,T2,T3,T4,T5,T6,T7,R>、Func8<T1,T2,T3,T4,T5,T6,T7,T8,R>、Func9<T1,T2,T3,T4,T5,T6,T7,T8,T9,R>、FunN<R>
Action提供了11个子类:包括
Action0、Action1<T1>、Action2<T1,T2>、Action3<T1,T2,T3>、Action4<T1,T2,T3,T4>、Action5<T1,T2,T3,T4,T5>、Action6<T1,T2,T3,T4,T5,T6>、Action7<T1,T2,T3,T4,T5,T6,T7>、Action8<T1,T2,T3,T4,T5,T6,T7,T8>、Action9<T1,T2,T3,T4,T5,T6,T7,T8,T9>、ActionN
根据Funcation或者Action 名称后面的数字判断参数的数量和是否有返回值。
4、Observable入口参数 OnSubscribe
前面说到的 OnSubscribe 是一个继承了 Action1 的接口,本身就是一个可以接收一个Subscriber
参数,没有返回值的Action1子类。
RxJava 在 Observable 内部包含唯一一个属性,类型就是OnSubscribe。
从Funcation到OnSubscribe的继承关系:
Funcation–>Action–>Action1–>OnSubscribe
当使用Observable 的from()和just()方法构造 Observable 实例的时候,传入的数据就被封装到 OnSubscribe 类型的属性中:
final OnSubscribe<T> onSubscribe;
5、OnSubscribe的继承和实现
RxJava 1.x提供了很多 OnSubscribe 的实现类。下面是一部分类的截图:
OnSubscribe接口在 Observable 的 subscribe() 方法被调用时继承自Action1的call()方法被执行,call()方法的参数是 Subscriber<T>
,也就是 subscribe()在订阅了 Observable 的 observer 实例。
static <T> Subscription subscribe(Subscriber<? super T> subscriber, Observable<T> observable){...}
OnSubscribe 的实现类是封装了原始数据的、继承了Action1的、接收一个参数Subscriber
、提供call()方法的 OnSubscribe 子类。
在这之前,我们提到的数据都是 Observable 类型。
在Observable内部,数据被保存在OnSubscribe类型中,使得原来的被封装的数据有了与外界交互的机会,就是当OnSubscribe的实现类call()方法被调用时,只有在那个时候,也只有在call()方法内部,被 Observable 封装起来的数据,才是可见的。
6、Observable的subscribe()方法
前面说过subscribe()方法是连接Observable和Observe的起点。
RxJava 1.x 提供了6个公共静态方法:
subscribe()subscribe(Action1<? super T>)subscribe(Action1<? super T>, Action1<Throwable>)subscribe(Action1<? super T>, Action1<Throwable>, Action0)subscribe(Observer<? super T>)subscribe(Subscriber<? super T>)
最后这些方法都指向:
static <T> Subscription subscribe(Subscriber<? super T> subscriber, Observable<T> observable){...//简化的写法 observable.onSubscribe.call(subscriber);...}
call()方法的逻辑如下:
// this.child 是call()方法传入的参数 subscriberfinal Subscriber<? super T> child = this.child;//array 是 Observable.from(T[] array)中传入的array数据 for (T t : array) { if (child.isUnsubscribed()) { return; } child.onNext(t); } if (child.isUnsubscribed()) { return; } child.onCompleted();
总结一下:
1、Observable通过 from()和just()将数据封装在OnSubscribe中;
2、OnSubscribe接受 Subscriber 类型的参数,在call()方法中将数据传递给Subscriber的方法。
下面就看看 Subscriber。
- RxJava 1.x 参数和参数的类型
- 关于请求参数的类型和获取请求参数方法
- 函数类型和参数类型
- 指针类型的参数和返回值
- MyBatis的传入和返回参数类型
- 函数参数的类型
- printf的参数类型
- list的参数类型
- switch的参数类型
- Object类型的参数
- &类型参数的坑
- 形式参数的类型
- C#的参数类型
- Python的参数类型
- 类型参数的类型推断
- 类型参数的类型推断
- 方法参数是基本类型和引用类型的区别
- C#中ref、out类型参数的区别和params类型参数的用法
- sysbench1.0.6 初学
- 类的创建与简单实现
- ubuntu下创建桌面快捷方式
- 语义分割--Learning Object Interactions and Descriptions for Semantic Image Segmentation
- 单例设计模式
- RxJava 1.x 参数和参数的类型
- DB2 SQL Error: SQLCODE=-803, SQLSTATE=23505
- 从google的todo学习MVP
- linux下更改Python版本
- Eclipse快捷键
- 【电路第七章之II篇】一阶电路的零状态响应分析
- Linux中tty框架与uart框架之间的调用关系剖析
- Error: Your project contains C++ files but it is not using a supported native build system
- 在React中受控和非受控的表单输入并不需要太复杂