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的用法在此记录,方便需要的同学查阅。


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