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


  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值