[关闭]
@cxm-2016 2016-11-28T09:27:59.000000Z 字数 3251 阅读 1938

RxJava学习指南(十四)——实现自己的操作符

RxJava学习指南

版本:1
整理:陈小默


实现自己的操作符

你可以实现你自己的Observable操作符,本文展示怎么做。

如果你的操作符是被用于创造一个Observable,而不是变换或者响应一个Observable,使用 create( ) 方法,不要试图手动实现 Observable。另外,你可以按照下面的用法说明创建一个自定义的操作符。

如果你的操作符是用于Observable发射的单独的数据项,按照下面的说明做:Sequence Operators 。如果你的操作符是用于变换Observable发射的整个数据序列,按照这个说明做:Transformational Operators

提示: 在一个类似于Groovy的语言Xtend中,你可以以 extension methods 的方式实现你自己的操作符 ,不使用本文的方法,它们也可以链式调用。详情参见 RxJava and Xtend

序列操作符

下面的例子向你展示了怎样使用lift( )操作符将你的自定义操作符(在这个例子中是 myOperator)与标准的RxJava操作符(如ofTypemap)一起使用:

  1. fooObservable = barObservable.ofType(Integer).map({it*2}).lift(new MyOperator<T>()).map({"transformed by myOperator: " + it});

下面这部分向你展示了你的操作符的脚手架形式,以便它能正确的与lift()搭配使用。

实现你的操作符

将你的自定义操作符定义为实现了 Operator 接口的一个公开类, 就像这样:

  1. public class MyOperator<T> implements Operator<T> {
  2. public MyOperator( /* any necessary params here */ ) {
  3. /* 这里添加必要的初始化代码 */
  4. }
  5. @Override
  6. public Subscriber<? super T> call(final Subscriber<? super T> s) {
  7. return new Subscriber<t>(s) {
  8. @Override
  9. public void onCompleted() {
  10. /* 这里添加你自己的onCompleted行为,或者仅仅传递完成通知: */
  11. if(!s.isUnsubscribed()) {
  12. s.onCompleted();
  13. }
  14. }
  15. @Override
  16. public void onError(Throwable t) {
  17. /* 这里添加你自己的onError行为, 或者仅仅传递错误通知:*/
  18. if(!s.isUnsubscribed()) {
  19. s.onError(t);
  20. }
  21. }
  22. @Override
  23. public void onNext(T item) {
  24. /* 这个例子对结果的每一项执行排序操作,然后返回这个结果 */
  25. if(!s.isUnsubscribed()) {
  26. transformedItem = myOperatorTransformOperation(item);
  27. s.onNext(transformedItem);
  28. }
  29. }
  30. };
  31. }
  32. }

变换操作符

下面的例子向你展示了怎样使用 compose( ) 操作符将你得自定义操作符(在这个例子中,是一个名叫myTransformer的操作符,它将一个发射整数的Observable转换为发射字符串的)与标准的RxJava操作符(如ofTypemap)一起使用:

  1. fooObservable = barObservable.ofType(Integer).map({it*2}).compose(new MyTransformer<Integer,String>()).map({"transformed by myOperator: " + it});

下面这部分向你展示了你的操作符的脚手架形式,以便它能正确的与compose()搭配使用。

实现你的变换器

将你的自定义操作符定义为实现了 Transformer 接口的一个公开类,就像这样:

````java
public class MyTransformer implements Transformer {
public MyTransformer( /* any necessary params here / ) {
/
这里添加必要的初始化代码 */
}

@Override
public Observable call(Observable source) {
/*
* 这个简单的例子Transformer应用一个map操作,
* 这个map操作将发射整数变换为发射整数的字符串表示。
*/
return source.map( new Func1() {
@Override
public String call(Integer t1) {
return String.valueOf(t1);
}
} );
}
}
````

参见

其它需要考虑的

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注