あなたは完全にRxJavaを理解して一つの記事

ちょうどRxJavaネットワーク要求フレーム学習の仕事の要件は、RxJava上のオンライン検索のチュートリアルの数が、すべては、よく理解、幸いにも最終的には、いくつかの記事は、初心者がそう理解と組み合わせるRxJavaを、理解するのに役立ちますが見つかりません私たちは私の咀嚼を通じて、あなたが理解するのに役立ちますことを願っていますし、使い始めるより速くRxJavaは、あまり話をしなかった、それが体内に入る!問題への再編成

1. RxJavaとは何ですか

•Rxは、応答の拡大に翻訳反応拡張速記、です。すなわち、一方の側から情報を送信することによって、及びコアフレーム処理コードに応答して他の情報。•フレームワークは、Microsoftの建築家エリック・メイジャーのチーム開発が主導し、2012年11月でオープン。

•Rxのライブラリは、.NET、JavaScriptとC ++は、現在ではほとんどすべての一般的なプログラミング言語のサポートサポートしています。

•Rxの最も責任ReactiveX言語ライブラリの保守団体は、より多くの人気は、コミュニティサイトがreactivex.ioそこRxJava / RxJS / Rx.NETです。

•RxJavaは、人気のフレームワークとして、Androidはまた、フレームワークをサポートしているため除き、RxJavaをサポートすることに加えて、GitHubの中にそのソースコードに頼るRxAndroid

コードを単純化2.RxJavaあなたが背景とリフレッシュインタフェースからデータを取得したい場合は、一般的な我々アンドリュースプロジェクトでは、コードは例で見てみましょう、のようなものです:

新しいスレッド(){@Overrideます。public void実行(){super.run(); (ファイルフォルダ:フォルダ)のための{ファイル[]ファイル= folder.listFiles(); (ファイルのファイル:ファイル)の{場合(。 "PNG" file.getName()endsWith()){最後のビットマップビットマップ= getBitmapFromFile(ファイル); 。getActivity()runOnUiThread(新しいRunnableを(){@Overrideます。public void実行(){imageCollectorView.addImage(ビットマップ);}}); }}}}} .start(); 上面的代码经过多层嵌套后可读性太差了如果你用了RxJava可以这样写:!Observable.from(フォルダ).flatMap(新しい関数func1 <ファイル、観察可能>(){@Override公共観察可能なコール(ファイルファイル){リターンObservable.from(file.listFiles());}}).filter(新しい関数func1 <ファイル、ブール>(){@Override公共ブールコール(ファイルファイル){リターンfile.getName()endsWith。 ( ".PNG");}}).MAP(新しい関数func1 <ファイル、ビットマップ>(){@Override公衆ビットマップ・コール(ファイルファイル){リターンgetBitmapFromFile(ファイル);}})。

この書き込みの利点はRxJavaは、各実行中のスレッドのための具体的な方法を提供し、コードを簡素化するだけでなく、コードの可読性を向上させるネストのレベルを低減することです。

3の枠組みの導入現在RxJavaは、バージョン2.0にアップグレードされましたが、より良いRxJavaを理解するために、我々は、バージョン1.0から学ぶために始めることができます。アンドリュースも活用RxJavaへの私たちのプロジェクトのための順序、導入されてもよいのGradleスクリプトは、プロジェクトに依存しています:コンパイル「io.reactivex:rxandroid:1.2.1 」コンパイル「io.reactivex:rxjava:1.1.6」 今、私たちプロジェクトがRxJavaに機能をサポートしてきました。4.応答応答、いわゆるコアは、二つの部分以外の何物でもありません、一部のイベント/メッセージの送信を担当し、他の部分は、イベント/メッセージに応答する責任があります。私たちがニュースを見たい場合はこれまで、一般的に、あなたは新聞を読む必要があります。たとえば、あなたには、いくつかの新聞や雑誌に興味がある、あなたが最初の3つのことを行う必要があります:

  1. 自宅の住所を提供します

  2. 対応する新聞を探します

  3. 長い新聞のうち、新たな情報があるとして一日の後に、上記のプロセスの後に月全体で新聞新聞に購読、雑誌の新聞がご自宅に送られます。

    Image01次のステップ、上記抽象コードの例:

     

  4. ビューアの提供(あなたは、雑誌の内容について懸念しているので、イベントのあなたの人々のように、人々を観察することです)

  5. (新聞は観察対象であるので、関係者に通知する必要の新雑誌アウトがある限りとして)ビューアの提供

  6. (観察者に、であると観察対象物と相互に直ちに観察者との間の変化は、イベントのオブジェクトを観察気づくであろう)購読

    image02上記の例は、以下のコードを示します。//観察者の作成を観察可能な観察可能= Observable.create(新新Observable.OnSubscribe()加入契約者のための{@Overrideます。public voidコール(){<スーパーストリング?> // 4送信を開始します。イベントイベントの3種類がある//)は(onNextは()onCompletedあるのonError( )// onCompleted()のonError() 一般的に、両方の一つだけを選択し終えたイベント通知オブザーバを送信するために使用されている。subscriber.onNext ( "こんにちはアンドロイド!"); subscriber.onNext( "こんにちはJavaの!"); subscriber.onNext( "こんにちはC!"); subscriber.onCompleted();}});

     

    // 2オブザーバ作成サブスクライバ加入=新たな加入者(){ @Override公共ボイドonCompleted(){Log.i(TAG、 "onCompletedを");}

    @Override
    public void onError(Throwable e) {
        Log.i(TAG, "onError: "+e.getLocalizedMessage());
    }
    
    @Override
    public void onNext(String s) {
        Log.i(TAG, "onNext: "+s);
    }
    复制代码

    }。

    。// 3サブスクリプション(アップ加入者用)Observable.subscribe;出力は次のよう:com.m520it.rxjavaするI / IT520:onNext:もしもしアンドロイドcom.m520it.rxjava I / IT520:onNext:もしもしJavaのcom.m520it.rxjava I /! IT520:onNext:こんにちはC com.m520it.rxjava I / IT520 :! •オブザーバー加入者が観察可能なオブザーバーをサブスクライブされている場合、システムが自動的に観測可能なオブジェクトのコールバックの内側を呼び出します、上記のコードを実行している原則onCompletedコード() 。•コールようonNext / onCompleted /のonErrorイベントを送信した後のような観察()メソッドエンティティにおいて。•その後、加入者は、対応するメソッドにコールバックすることができるようになります。3つの方法がonNextを送信し、onErrorを、通常の観察者観察可能なバリアントをonCompleted、そして、シングル観察可能とちょうど2つの方法の変種される必要があります:•するonSuccess -放出されていない場合-このメソッドへの送信のシングル単一の値を•のonError目標値の後に、シングルはシングルのみで、これらの2つの方法のいずれか1つだけ呼び出し、任意のメソッドの呼び出しを呼び出して、サブスクリプションの関係を終了します。このメソッドにThrowableオブジェクトを起動します。最後のシングルシングル= Single.create(新Single.OnSubscribe (){@Overrideます。public voidコール(SingleSubscriber <?スーパー文字列> singleSubscriber){// 最初の呼び出しonNext()最後の呼び出しは()onCompleted//singleSubscriber.onSuccess( "こんにちはアンドロイド!"); //只调用のonError(); singleSubscriber.onError(新NullPointerExceptionが( "モック例外!")); }})。

    オブザーバオブザーバ=新しい観察(){@Override公共ボイドonCompleted(){Log.i(TAG、 "onCompleted")。}

    @Override
    public void onError(Throwable e) {
        Log.i(TAG, "onError: "+e.getLocalizedMessage());
    }
    
    @Override
    public void onNext(String s) {
        Log.i(TAG, "onNext: "+s);
    }
    复制代码

    }; Single.subscribe(観察); 6.観察者がオブザーバーオブザーバオブジェクトの変異体は、我々は、上記Subscriberオブジェクトに置き換えます。オブジェクト自体はオブザーバー継承されるので。オブジェクトが実装onNext()&onCompleted()&のonError()イベント、我々はよりその場合、のみ、次のコードに対応するメソッドを実装する必要が懸念される場合://オブザーバ加入者の加入者を作成=新たな加入者(){@Override公共ボイドonCompleted(){Log.i(TAG、 "onCompleted");}

    @Override
    public void onError(Throwable e) {
        Log.i(TAG, "onError: "+e.getLocalizedMessage());
    }
    
    @Override
    public void onNext(String s) {
        Log.i(TAG, "onNext: "+s);
    }
    复制代码

    }。

    //あなただけ興味onNext()イベントであれば、observable.subscribe(加入者);.上記のコードを購読が、onCompleted()&のonError()イベントなどのコードは非常に面倒になりを実現しなければなりませんでした。//指定されたイベントのために別のインタフェースアクション1 onNextAction =新しいアクション1(){@Overrideます。public voidコール(文字列S){ログインonNextを作成します。この需要を考えると、RxJavaのサブスクリプションは、次のように、特定の調整の枠組みの中で行われました。 I(TAG、 "呼び出し:" + S);}};

    // observable.subscribe(onNextAction)を購読。

    
    复制代码

あなたが気づいた場合、私は知らない、サブスクライブ()サブスクリプションはもはや観測者ではありませんが、インタフェースオブジェクトonNext特定。以下のように、我々は、対応するサブスクリプションを達成することができますされている同様の機能が必要:

公共購読購読(最終オブザーバーオブザーバー)公募は、サブスクライブ(最終アクション1 onNext)公共のサブスクリプション(最終アクション1 onNext、アクション1のonError)公募は、サブスクライブ(最終アクション1 onNext、アクション1のonError、Action0 onCompleted)をサブスクライブ

forEachの機能もあり、同様の機能を持っています:

公共ボイドのforEach(最終アクション1 onNext)公共ボイドforEachの(最終的なアクション1 onNext、アクション1のonError)公共ボイドforEachの(最終的なアクション1 onNext、アクション1のonError、Action0 onCompleteの)

## 7.Subjectバリアント

上記の両方に導入された第2節では、観察者の変異体、および観察者(観察者の両方として使用されるオブザーバとして使用されてもよい)、再度雌雄同体を施すここで説明する変異体について説明します。

異なるシナリオのための件名の4つのタイプがあります。彼らはすべての実装では、すべての存在しません。

### AsyncSubject

元が完了した後にのみ、A AsyncSubject観測、観測の元の放射から最後の値。この最後の値は、それはそれ以降の観察者に送信します。

以下のコードを投稿://は= AsyncSubject.create()観測された最終AsyncSubjectの件名を作成し; //作成Aビューア加入者の加入者=新加入(){@Overrideます。public void onCompleted(){Log.i(TAG、「onCompleted 「);}

@Override
public void onError(Throwable e) {
    Log.i(TAG, "onError");
}

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

}
复制代码

}; //イベントsubject.subscribe(加入者)に加入し、イベントが送信された場合//オブザーバーは(onCompleted呼び出す)、onNextは()最後のイベントを出力します。ない場合は、いずれにしてもonNext()は印刷されません。subject.onNext( "こんにちはアンドロイド"); subject.onNext( "こんにちはJavaの"); subject.onCompleted();出力:S:こんにちは、Javaは、エラーが発生したため終了し、元の観測場合は、AsyncSubjectはないでしょう、しかし、onCompleted任意のデータを送信し、単に前方、このエラー通知を渡します。

上記今一連の信号を発し、最後に次のように異常コードは、観察者の観察者コードと同じです。

subject.onNext( "こんにちはアンドロイド"); subject.onNext( "こんにちはJavaの"); //送信例外それonNext()subject.onError(ヌル)印刷されないので、### BehaviorSubject

観察者がBehaviorSubject、彼が加入する前にイベントを送信しない場合は、プリントアウトされる前に、すべての加入者に送信されたイベントの後、最後の伝送に加入することになるイベントを購読すると、そのオブジェクトとサブスクリプション内で作成するコンストラクタ(T)を受信するようにデフォルト設定されますすべてのイベントの後に、次の通り:BehaviorSubject対象= BehaviorSubject.create( "NROMAL")。

加入者の加入者=新たな加入者(){@Override公共ボイドonCompleted(){Log.i(TAG、 "onCompleted")。}

@Override
public void onError(Throwable e) {
    Log.i(TAG, "onError");
}

@Override
public void onNext(Object o) {
    Log.i(TAG, "onNext: " + o);
}
复制代码

}; //Subject.onNext( "こんにちはアンドロイド!"); //Subject.onNext( "こんにちはJavaの!"); //Subject.onNext( "Cこんにちは!"); //ここでは、3を超える場合には購読します注釈、ハローCのイベントを削除し、イベントをサブスクライブし、上記3つのコメント//コンストラクタNORMALイベントの発効後の印刷を削除し、イベントsubject.subscribe(加入者)の発効の背面にサブスクライブする場合に有効に戻しません。

subject.onNext( "こんにちはCPP!"); subject.onNext( "こんにちはIOS!"); PublishSubject

PublishSubjectのみ観察者に元の観測放射から時間サブスクリプション・データのポイントの後に発生します。

PublishSubjectが完了を作成するかもしれない、という注意はすぐにデータの送信を開始し、その危険性があります。この期間は、視聴者がそれに加入する前に作成する必要があり件名の後、一件の以上のデータが失われる可能性があります。

コードは以下の通りである:PublishSubject対象= PublishSubject.create()。

アクション1 onNextAction1 =新しいアクション1(){

@Override
public void call(String s) {
    Log.i(TAG, "onNextAction1 call: "+s);
}
复制代码

}。

アクション1 onNextAction2 =新しいアクション1(){

@Override
public void call(String s) {
    Log.i(TAG, "onNextAction2 call: "+s);
}
复制代码

}。

subject.onNext( "こんにちはアンドロイド!"); subject.subscribe(onNextAction1)。subject.onNext( "こんにちはJavaの!"); subject.subscribe(onNextAction2)。subject.onNext( "こんにちはIOS!");

次のように出力されます。

onNextAction1コール:こんにちはJavaの!onNextAction1コール:こんにちはIOS!onNextAction2コール:こんにちはIOS!ReplaySubject

ReplaySubjectにかかわらず、彼らが加入したときの、観察者にオリジナルの観察可能なすべてのデータを送信します。

コードは以下の通りであります:

ReplaySubject対象= ReplaySubject.create()。

アクション1 onNextAction1 =新しいアクション1(){

@Override
public void call(String s) {
    Log.i(TAG, "onNextAction1 call: "+s);
}
复制代码

}。

アクション1 onNextAction2 =新しいアクション1(){

@Override
public void call(String s) {
    Log.i(TAG, "onNextAction2 call: "+s);
}
复制代码

}。

subject.onNext( "こんにちはアンドロイド!"); subject.subscribe(onNextAction1)。subject.onNext( "こんにちはJavaの!"); subject.subscribe(onNextAction2)。subject.onNext( "こんにちはIOS!");

次のように出力されます。

onNextAction1コール:こんにちはアンドロイド!onNextAction1コール:こんにちはJavaの!onNextAction2コール:こんにちはアンドロイド!onNextAction2コール:こんにちはJavaの!onNextAction1コール:こんにちはIOS!onNextAction2コール:こんにちはIOS!###件名总结

サブスクリプションが唯一の最後の例外が発生した場合、それはどのonNextを印刷しないであろう、最後onNext()イベントを受信するたびにAsyncSubjectは()BehaviorSubjectは最後まで印刷を開始する()購読正面からoNext続きます。サブスクリプションの前に無コールonNext()場合は、そのオブジェクトに渡されたデフォルトのレコード生成(T)を呼び出します。例外呼び出しの後、onNextは(のみPublishSubject印刷加入後のいずれにしても)印刷されていない場合。送信されたときに、イベントに関係なく、サブスクリプションのReplaySubjectが呼び出されます。

それは私はあなたが他の乾燥品のシェアを持っている場合、知識のRxJavaに始める知っているが、また、追加することになり、すべてです。

 

おすすめ

転載: www.cnblogs.com/waiwei/p/11995867.html