RXBUS的简单使用

来源:互联网 发布:ps光学软件 编辑:程序博客网 时间:2024/05/17 22:46

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


2 0
原创粉丝点击