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的用法在此記錄,方便需要的同學查閱。