PublishSubject
与普通的Subject不同,在订阅时并不立即触发订阅事件,而是允许我们在任意时刻手动调用onNext(),onError(),onCompleted来触发事件。
可以看到PublishSubject与普通的Subject最大的不同就是其可以先订阅事件,然后在某一时刻手动调用方法来触发事件,那么拿他又能做些什么?
举个例子:当一个界面发生改变,通知另一个界面做出响应,以下是两个Fragment之间通讯的Demo
1、首先在外部定义好公共的PublishSubject
对象
PublishSubject<String> publishSubject = PublishSubject.create();2、TopFragment中负责发生改变并发出信息
PublishSubjectTopFragment topFragment = new PublishSubjectTopFragment(publishSubject);
PublishSubjectBottomFragment bottom_Fragment = new PublishSubjectBottomFragment(publishSubject);
getActivity().getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fl_top,topFragment, "top")
.replace(R.id.fl_bottom, bottom_Fragment, "bottom")
.commit();
@OnClick(R.id.btn_send)3、BottomFragment中接收到通知后,产生响应
void sendToBottom(){
String result = et_input.getText().toString().trim();
publishSubject.onNext(result);
}
publishSubject.subscribe(new Action1<String>() {
@Override
public void call(String s) {
tv_result.setText(s);
}
});
效果图:
源码: https://github.com/cn-ljb/rxjava_for_android