实现自己的操作符
如果你的操作符是被用于创造一个Observable,而不是变换或者响应一个Observable,使用 方法,不要试图手动实现 Observable
。另外,你可以按照下面的用法说明创建一个自定义的操作符。
如果你的操作符是用于Observable发射的单独的数据项,按照下面的说明做: 。如果你的操作符是用于变换Observable发射的整个数据序列,按照这个说明做:Transformational Operators 。
序列操作符
下面的例子向你展示了怎样使用lift( )
操作符将你的自定义操作符(在这个例子中是 myOperator
)与标准的RxJava操作符(如ofType
和map
)一起使用:
下面这部分向你展示了你的操作符的脚手架形式,以便它能正确的与lift()
搭配使用。
变换操作符
下面的例子向你展示了怎样使用 compose( )
操作符将你得自定义操作符(在这个例子中,是一个名叫的操作符,它将一个发射整数的Observable转换为发射字符串的)与标准的RxJava操作符(如ofType
和map
)一起使用:
下面这部分向你展示了你的操作符的脚手架形式,以便它能正确的与compose()
搭配使用。
- by Dan Lew
其它需要考虑的
- 请注意:你的序列操作符必须复合Observable协议的核心原则:
- 它可能调用订阅者的 方法任意次,但是这些调用必须是不重叠的。
- 它只能调用订阅者的
onCompleted( )
或 正好一次,但不能都调用,而且不能在这之后调用订阅者的 方法。 - 如果你不能保证你得操作符遵从这两个原则,你可以给它添加 操作符,它会强制保持正确的行为。
- 请关注这里 Issue #1962 —需要有一个计划创建一个测试脚手架,你可以用它来写测试验证你的新操作符遵从了Observable协议。
- 不要让你的操作符阻塞别的操作。
- When possible, you should compose new operators by combining existing operators, rather than implementing them with new code. RxJava itself does this with some of its standard operators, for example:
- 如果你的操作符使用了函数或者lambda表达式作为参数,请注意它们可能是异常的来源,而且要准备好捕获这些异常,并且使用
onError()
通知订阅者。- 某些异常被认为是致命的,对它们来说,调用
onError()
毫无意义,那样或者是无用的,或者只是对问题的妥协。你可以使用Exceptions.throwIfFatal(throwable)
方法过滤掉这些致命的异常,并重新抛出它们,而不是试图发射关于它们的通知。
- 某些异常被认为是致命的,对它们来说,调用
- 一般说来,一旦发生错误应立即通知订阅者,而不是首先尝试发射更多的数据。
- 请注意
null
可能是Observable发射的一个合法数据。频繁发生错误的一个来源是:测试一些变量并且将持有一个非 值作为是否发射了数据的替代。一个值为null
的数据仍然是一个发射数据项,它与没有发射任何东西是不能等同的。