RxBus学習の旅-入門から向上へ

6031 ワード

会社の技術分かち合い会で、RxBusについての学習分かち合いを行い、以下のように記録した.
一.RxBusとRxJava
1回のRxJava呼び出しプロセスは、次の段階に分けられます.
  • 観察内容(フラグメント1)
  • を作成する
  • データ処理/マッピング(フラグメント2)
  • 選択スレッド(フラグメント3)
  • 購読(フラグメント4,フラグメント5)
  • 完了/エラー処理(フラグメント6)
  • サンプルコード:
    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つのステップを含む完全なインタフェースコールバック.
  • インタフェース定義
  • インタフェース呼び出し
  • インタフェース実装
  • インタフェース注入
  • RxBusの使用プロセスは、インタフェースコールバックのプロセスです.
    インタフェース定義は、RxJavaで定義されています.
    上記の例のコードセグメント1のsuscriber.onNext()、onStart()、onError()、onComplete()は、インタフェース呼び出しに対応します.
    コードフラグメント5、フラグメント6これらはインタフェース実装である
    注入のプロセスはsuscribe()メソッドのサブスクリプションを呼び出すプロセスです
    三.RxBusソース分析
    RxBusのコードは以下のように実現される.
    public class RxBus {
    
    private static volatile RxBus instance;
    private final Subject _bus;
    
    
    private RxBus() {
        _bus = new SerializedSubject<>(PublishSubject.create());
    }
    
    public static RxBus getInstance() {
        if (null == instance) {
            synchronized (RxBus.class) {
                if (null == instance) {
                    instance = new RxBus();
                }
            }
        }
        return instance;
    }
    
    public void send(Object object) {
        try{
            _bus.onNext(object);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    
    public boolean hasObservers() {
        return _bus.hasObservers();
    }
    
    
    
    private  Observable toObservable(final Class type) {
        return _bus.ofType(type);//filter + cast
    }
    
    
    
    
    
    
    
    public  Subscription toSubscription(final Class type, Observer observer) {
        return toObservable(type).subscribe(observer);
    }
    
    public  Subscription toSubscription(final Class type, Action1 action1) {
        return toObservable(type).subscribe(action1);
    }
    
    public  Subscription toSubscription(final Class type, Action1 action1, Action1 errorAction1) {
        return toObservable(type).subscribe(action1,errorAction1);
    }
    }
    

    次に、上記のコードを簡単に分析します.
    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が実行中に、任意のセクションでエラーが発生すると、サブスクリプション関係はキャンセルされます.その後再度送信すると、サブスクリプション後のコールバックは実行できません.
    配列の境界を越えたエラーを実証しました
    @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
    

    解決の構想:
  • try-catchを使用して例外をキャプチャし、RxJavaによって例外がキャプチャされないようにする
  • onErrorで再購読します.

  • 次に2つ目の方法について、具体的にどのように操作するかというと、実はonErrorメソッドで、サブスクリプションを再実行し、上記の注釈の付いたコードonRxBusを実行することで、問題を解決します.
    五.小結
    上記は実は今回の技術の分かち合いの大綱で、技術の分かち合いは授業の前に準備して、以下の文章を塗って、RxBusに対してもっと細かい学習と理解があって、読むことができます:(推薦)
    謝三弟シリーズ
    RxBusのシンプルな実装
    RxBus深入ソース解析
    RxJava里onError異常処理
    Yokeyシリーズ
    RxJava実装イベントバス
    RxBus異常処理
    RxBus実装Stickyイベント(スティッキー購読)
    その他
    RxBusのインフラストラクチャからアップグレードまで、独自のRxBusを構築
    EventBusとRxBusの実装とパフォーマンスの比較