RxBus学習の旅-入門から向上へ
6031 ワード
会社の技術分かち合い会で、RxBusについての学習分かち合いを行い、以下のように記録した.
一.RxBusとRxJava
1回のRxJava呼び出しプロセスは、次の段階に分けられます.観察内容(フラグメント1) を作成するデータ処理/マッピング(フラグメント2) 選択スレッド(フラグメント3) 購読(フラグメント4,フラグメント5) 完了/エラー処理(フラグメント6) サンプルコード:
二.RxBusとインタフェースコールバック
4つのステップを含む完全なインタフェースコールバック.インタフェース定義 インタフェース呼び出し インタフェース実装 インタフェース注入 RxBusの使用プロセスは、インタフェースコールバックのプロセスです.
インタフェース定義は、RxJavaで定義されています.
上記の例のコードセグメント1のsuscriber.onNext()、onStart()、onError()、onComplete()は、インタフェース呼び出しに対応します.
コードフラグメント5、フラグメント6これらはインタフェース実装である
注入のプロセスはsuscribe()メソッドのサブスクリプションを呼び出すプロセスです
三.RxBusソース分析
RxBusのコードは以下のように実現される.
次に、上記のコードを簡単に分析します.
volatile instance可視性を保証 禁止指令並び替え ここではJavaメモリモデルについて、関連資料:転送ゲート
SerializedSubject SerializedSubject extends Subject extends Observable implements Observerは、観察内容であり、観察者であり、ブリッジ/データ転送の役割を果たす はマルチスレッドセキュリティを保証し、SubjectはSubscriberとして使用され、複数のスレッドからそのonNextメソッド(他のonシリーズメソッドを含む) を呼び出す.
PublishSubject
テーマ、RxJavaには4つのテーマがあります PublishSubject BehaviorSubject ReplaySubject AsyncSubject
PublishSubjectの意味は、購読者が購読した時点以降のデータが観察者に送信されることです.
ofTypeオペレータ=filterオペレータ+castオペレータ filterは、フィルタ条件を満たすデータのみが「送信」される . castは、1つのObservableを指定のタイプのObservable に変換する.
CompositeSubscription
このオブジェクトはsubscriptionのコンテナとして、一括して購読をキャンセルするのに便利です
四.RxBus異常処理
RxBusが実行中に、任意のセクションでエラーが発生すると、サブスクリプション関係はキャンセルされます.その後再度送信すると、サブスクリプション後のコールバックは実行できません.
配列の境界を越えたエラーを実証しました
このときbuttonボタンをクリックすると、配列が境界を越えて異常になり、2回目にButtonをクリックしてメッセージを送信したが、応答しなかった.ここで、RxBusは、正確にはRxJavaがエラー異常をキャプチャすると、サブスクリプション関係がキャンセルされます.
解決の構想: try-catchを使用して例外をキャプチャし、RxJavaによって例外がキャプチャされないようにする onErrorで再購読します.
次に2つ目の方法について、具体的にどのように操作するかというと、実はonErrorメソッドで、サブスクリプションを再実行し、上記の注釈の付いたコードonRxBusを実行することで、問題を解決します.
五.小結
上記は実は今回の技術の分かち合いの大綱で、技術の分かち合いは授業の前に準備して、以下の文章を塗って、RxBusに対してもっと細かい学習と理解があって、読むことができます:(推薦)
謝三弟シリーズ
RxBusのシンプルな実装
RxBus深入ソース解析
RxJava里onError異常処理
Yokeyシリーズ
RxJava実装イベントバス
RxBus異常処理
RxBus実装Stickyイベント(スティッキー購読)
その他
RxBusのインフラストラクチャからアップグレードまで、独自のRxBusを構築
EventBusとRxBusの実装とパフォーマンスの比較
一.RxBusとRxJava
1回のRxJava呼び出しプロセスは、次の段階に分けられます.
Observable
// 1
.create(new Observable.OnSubscribe() {
@Override
public void call(Subscriber super String> subscriber) {
subscriber.onStart();
String trim = mainEd.getText().toString().trim();
subscriber.onNext(trim);
subscriber.onError(new Throwable());
subscriber.onCompleted();
}
})
// 2
.map(new Func1() {
@Override
public String call(String s) {
return s + " sugarya";
}
})
// 3
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
// 4
.subscribe(
// 5
new Subscriber() {
@Override
public void onStart() {
super.onStart();
}
// 6
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
mainTv2.setText(s);
}
});
二.RxBusとインタフェースコールバック
4つのステップを含む完全なインタフェースコールバック.
インタフェース定義は、RxJavaで定義されています.
上記の例のコードセグメント1のsuscriber.onNext()、onStart()、onError()、onComplete()は、インタフェース呼び出しに対応します.
コードフラグメント5、フラグメント6これらはインタフェース実装である
注入のプロセスはsuscribe()メソッドのサブスクリプションを呼び出すプロセスです
三.RxBusソース分析
RxBusのコードは以下のように実現される.
public class RxBus {
private static volatile RxBus instance;
private final Subject
次に、上記のコードを簡単に分析します.
volatile
SerializedSubject
PublishSubject
テーマ、RxJavaには4つのテーマがあります
PublishSubjectの意味は、購読者が購読した時点以降のデータが観察者に送信されることです.
ofTypeオペレータ=filterオペレータ+castオペレータ
CompositeSubscription
このオブジェクトはsubscriptionのコンテナとして、一括して購読をキャンセルするのに便利です
四.RxBus異常処理
RxBusが実行中に、任意のセクションでエラーが発生すると、サブスクリプション関係はキャンセルされます.その後再度送信すると、サブスクリプション後のコールバックは実行できません.
配列の境界を越えたエラーを実証しました
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
onRxBus();
}
private void onRxBus() {
int[] array = new int[2];
RxBus.getInstance().toSubscription(Integer.class, new Subscriber() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
//onRxBus();
Log.e(TAG, "mSubscriber17 onError: " + e.toString());
}
@Override
public void onNext(Integer integer) {
array[integer] = integer;
Log.e(TAG, "mSubscriber17 onNext:" + integer);
}
});
}
@OnClick(R.id.btn_main17)
void onClick17() {
RxBus.getInstance().send(2);
}
このときbuttonボタンをクリックすると、配列が境界を越えて異常になり、2回目にButtonをクリックしてメッセージを送信したが、応答しなかった.ここで、RxBusは、正確にはRxJavaがエラー異常をキャプチャすると、サブスクリプション関係がキャンセルされます.
E/MainActivity: mSubscriber17 onError: java.lang.ArrayIndexOutOfBoundsException: length=2; index=2
解決の構想:
次に2つ目の方法について、具体的にどのように操作するかというと、実はonErrorメソッドで、サブスクリプションを再実行し、上記の注釈の付いたコードonRxBusを実行することで、問題を解決します.
五.小結
上記は実は今回の技術の分かち合いの大綱で、技術の分かち合いは授業の前に準備して、以下の文章を塗って、RxBusに対してもっと細かい学習と理解があって、読むことができます:(推薦)
謝三弟シリーズ
RxBusのシンプルな実装
RxBus深入ソース解析
RxJava里onError異常処理
Yokeyシリーズ
RxJava実装イベントバス
RxBus異常処理
RxBus実装Stickyイベント(スティッキー購読)
その他
RxBusのインフラストラクチャからアップグレードまで、独自のRxBusを構築
EventBusとRxBusの実装とパフォーマンスの比較