#實作您自己的運算子
您可以實作您自己的 Observable 運算子。此頁面將說明如何實作。
如果您的運算子是設計用來產生 Observable,而不是轉換或響應來源 Observable,請使用 create( )
方法,而不是嘗試手動實作 Observable
。否則,請按照以下說明操作。
以下範例示範如何透過使用 lift( )
運算子,將自訂運算子(在本範例中為:myOperator
)與標準 RxJava 運算子鏈接在一起。
Observable foo = barObservable.ofType(Integer).map({it*2}).lift(new myOperator<T>()).map({"transformed by myOperator: " + it});
以下章節將說明如何建立您運算子的骨架,使其能正確地與 lift( )
搭配運作。
將您的運算子定義為實作 Operator
介面的 public 類別,如下所示:
public class myOperator<T> implements Operator<T> {
public myOperator( /* any necessary params here */ ) {
/* any necessary initialization here */
}
@Override
public Subscriber<? super T> call(final Subscriber<? super T> s) {
return new Subscriber<t>(s) {
@Override
public void onCompleted() {
/* add your own onCompleted behavior here, or just pass the completed notification through: */
if(!s.isUnsubscribed()) {
s.onCompleted();
}
}
@Override
public void onError(Throwable t) {
/* add your own onError behavior here, or just pass the error notification through: */
if(!s.isUnsubscribed()) {
s.onError(t);
}
}
@Override
public void onNext(T item) {
/* this example performs some sort of simple transformation on each incoming item and then passes it along */
if(!s.isUnsubscribed()) {
transformedItem = myOperatorTransformOperation(item);
s.onNext(transformedItem);
}
}
};
}
}
isUnsubscribed( )
狀態。不要浪費時間產生 Subscriber 不感興趣的項目。onNext( )
方法,但這些呼叫必須是非重疊的。onCompleted( )
或 onError( )
方法其中之一,而且只能呼叫一次,之後不得再呼叫 Subscriber 的 onNext( )
方法。serialize( )
運算子來強制執行正確的行為。onError( )
呼叫通知訂閱者。