RxBusはRxJava 1に基づく.xメッセージングメカニズムの実現


このセクションでは、RxJava 1について説明します.xのもう一つの特性.RxBusは、メッセージングメカニズムを実現します.
ネット上でRxBusについてRxJava 1.x上のパッケージは多いですが、呼び出しがまだ簡潔ではないと思い、自分でまた少しパッケージしました.
まず、appのmoduleにRxJava 1を導入する.xの依存:
   //rxjava
    compile 'io.reactivex:rxjava:1.2.7'//rx Android   
    compile 'io.reactivex:rxandroid:1.2.1'//rxjava

次に、RxBusのメッセージ・メカニズム呼び出しクラスを作成します.コードは次のとおりです.
package com.test.rxbus;

import rx.Observable;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
import rx.schedulers.Schedulers;
import rx.subjects.PublishSubject;
import rx.subjects.SerializedSubject;
import rx.subjects.Subject;

/**
 * Created by Admin on 2017/5/19.
 *
 * RxBus         
 *
 *     RxJava1.x    
 *
 * //rxjava
 * compile 'io.reactivex:rxjava:1.2.7'//rx Android   
 * compile 'io.reactivex:rxandroid:1.2.1'//rxjava
 *
 */
public class RxBus {

    private final Subject bus;
    private Subscription mSubscription;

    private RxBus() {
        bus = new SerializedSubject<>(PublishSubject.create());
    }

    /**
     *     RxBus
     *
     * @return
     */
    private static class RxBusHolder {
        private static final RxBus instance = new RxBus();
    }

    public static synchronized RxBus getInstance() {
        return RxBusHolder.instance;
    }

    /**
     *     
     *
     * @param eventType
     * @param 
     * @return
     */
    private  Observable toObserverable(Class eventType) {
        return bus.ofType(eventType);
    }

    public interface CallBack{
        void onCallBack(Object obj);
    }


    /**
     *     ,    
     *
     * @param data
     */
    public void post(RxData data) {
        bus.onNext(data);
    }


    /***
     *     ,    (    setListener ,  button     )
     */
    public void register(final CallBack callBack){
        mSubscription = RxBus.getInstance().toObserverable(RxData.class)
                // io      ,          
                .subscribeOn(Schedulers.io())
                //        ,  UI    
                .observeOn(AndroidSchedulers.mainThread())
                //     
                .subscribe(new Action1() {
                    @Override
                    public void call(RxData data) {
                       if(callBack!=null){
                           callBack.onCallBack(data);
                       }
                    }
                });
    }

    /***
     *   ,    
     */
    public void unRegister(){
        if(mSubscription!=null&&!mSubscription.isUnsubscribed()){
            mSubscription.unsubscribe();
        }
    }

}

メッセージ伝達のキャリアRxDataに関し、modelであり、コードは以下の通りである.
package com.test.rxbus;

import java.io.Serializable;

/**
 * Created by Admin on 2017/5/19.
 */

public class RxData implements Serializable{

    private int code;
    private String message;
    private T data;

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

}

主にこの2つのクラスに関連し、activityでどのように呼び出されるかを見てみましょう.
まずactivityはRxBusのCallBackインタフェースを実現し、以下のようにします.
public class MainActivity extends BaseActivity implements MainContract.View,View.OnClickListener,RxBus.CallBack{

次に、setListenerメソッドにRxBusを登録します.コードは次のとおりです.
    @Override
    protected void setListener() {
        mBtnFinger.setOnClickListener(this);
        //  Rxbus
        RxBus.getInstance().register(this);
    }

activityによりRxBusが実現する.CallBackインタフェースは、データを受信するためのonCallBack(RxData data)メソッドを自動的に生成します.
次にactivityのデータがどのように発行され、受信されたかを見てみましょう.まず、発行コードを見てみましょう.ここでは、ボタンをクリックしてデータを送信する例を示します.
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.finger:

                RxData data=new RxData();
                data.setCode(0x1);
                data.setMessage("     ");
                data.setData("    ");

                RxBus.getInstance().post(data);

                LogUtil.e("====fashe====");

                break;
            default:
                break;
        }
    }

activityで受信したデータのコードを見てみましょう.
    @Override
    public void onCallBack(Object obj) {
        int code= ((RxData)obj).getCode();
        String message= ((RxData)obj).getMessage();
        String data= ((RxData)obj).getData().toString();

        LogUtil.e("====code===="+code);
        LogUtil.e("====message===="+message);
        LogUtil.e("====data===="+data);
    }

もちろん、実行が完了したら、activityのondestroyでログアウトすることを忘れないでください.
    @Override
    protected void onDestroy() {
        //  Rxbus
        RxBus.getInstance().unRegister();
        super.onDestroy();
    }

最後に実行した結果は次のとおりです.
05-19 13:10:01.420 7983-7983/com.test E/pei: ====fashe====
05-19 13:10:01.421 7983-7983/com.test E/pei: ====code====1
05-19 13:10:01.421 7983-7983/com.test E/pei: ====message====     
05-19 13:10:01.421 7983-7983/com.test E/pei: ====data====    

Ok,BxBusについてRxJava 1.xの運用は今日ここまでです.ありがとうございます.