RXBUS的簡單使用

RxBus是用來進行組件之間通訊的。因爲項目當中用到了RxJava,因此用RxBus來實現組件之間的通訊,相對來說比較方便。關於RxBus的介紹和其他組件通訊工具EventBus可參考下面鏈接:

用RxJava實現事件總線

EventBus實戰

在沒有這些工具之前,我們是怎麼實現組件之間的通訊呢?我想到了三點:

1、用intent來傳遞數據

2、用注入依賴回調(意思就是註冊監聽回調)

3、藉助廣播組件(推薦使用本地廣播)

我覺得有這三點也足夠應付項目上的需求了。但當業務複雜的情況下,藉助RxBus或EventBus可大大提高我們的開發效率,而且深度解耦。

下面來看下RxBus是如何使用的:

創建RxBus類:

public class RxBus {
    private final Subject<Object, Object> _bus;
    private static class RxBusHolder{
        private static final RxBus instance = new RxBus();
    }

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

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

    public void post(Object o) {
        _bus.onNext(o);
    }

    public <T> Observable<T> toObserverable(Class<T> eventType) {
        return _bus.ofType(eventType);
    }
}

假如我的需求是這樣的:Main2Activity界面做了操作來更新MainActivity界面

首先MainActivity得先註冊吧:

public class MainActivity extends AppCompatActivity {

    @BindView(R.id.test)
    TextView test;
    Subscription mSubscription;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        initRxBus();
    }

    private void initRxBus() {
        mSubscription = RxBus.getInstance().toObserverable(UserEvent.class)
                .subscribe(new Action1<UserEvent>() {
                               @Override
                               public void call(UserEvent userEvent) {
                                   long id = userEvent.getId();
                                   String name = userEvent.getName();
                                   Toast.makeText(MainActivity.this, "name = " + name, Toast.LENGTH_SHORT).show();
                               }
                           },
                        new Action1<Throwable>() {
                            @Override
                            public void call(Throwable throwable) {
                            }
                        });
    }

    @Override
    protected void onResume() {
        super.onResume();
        GankRequestHelp.onRequest();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (!mSubscription.isUnsubscribed()) {
            mSubscription.unsubscribe();
        }
    }

    public void onViewClick(View v) {
        Intent intent = new Intent(this, Main2Activity.class);
        startActivity(intent);
    }
}

可以看到在initRxBus中向RxBus中的Subject(充當被觀察者)訂閱了觀察者,toObserverable用來過濾UserEvent類型,另外記得onDestroy時進行銷燬,防止內存泄漏。

然後我們在Main2Activity中傳遞數據:

    public void onPostRxBusClick(View view) {
        RxBus.getInstance().post(new UserEvent(1, "wuliqing"));
    }

可以看到向RxBus中的Subject(充當觀察者)提交數據。然後Subject會將數據發射給訂閱的觀察者。
最後我們可以看到MainActivity接收到了數據。如果在發送數據之前有多處地方訂閱了,則都會收到數據。

RXbus的用法在此記錄,方便需要的同學查閱。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章