RxBus是用来进行组件之间通讯的。因为项目当中用到了RxJava,因此用RxBus来实现组件之间的通讯,相对来说比较方便。关于RxBus的介绍和其他组件通讯工具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的用法在此记录,方便需要的同学查阅。