简单的实现一下RXBUS的思想
在我的理解里面,RXBUS可以理解为就像乘公交车一样,上车然后到达目的地下车。在代码里面可以理解为发送一个被观察者到集合然后根据类型来决定是否订阅。和公交的上车下车目的几乎一致(不 是一致)。
如果不熟悉RXJAVA的同学请到这里来了解
给 Android 开发者的 RxJava 详解
一·创建一个RXJAVA 只需要几步
创建订阅者
mSubscriber = new Subscriber<String>() {
@Override
public void onStart() {
super.onStart();
showtext="";
showtext+="开始了";
}
@Override
public void onCompleted() {
showtext+="成功233333";
mShowrxtext.setText(showtext);
}
@Override
public void onError(Throwable e) {
showtext+="失败23333";
}
@Override
public void onNext(String s) {
showtext+=s;
}
};
创建被观察者
mObservable = Observable.create(new Observable.OnSubscribe<String>(){
@Override
public void call(Subscriber<? super String> subscriber) {
mObserver.onNext("hello ");
mObserver.onNext("world");
mObserver.onNext("!!!!!");
mObserver.onCompleted();
}
});
然后订阅者订阅被观察者
mObservable.subscribe(mObserver)
这样就完成了一个最简单的RXJAVA程序
二·实现RXBUS
public class RxBus {
private static volatile RxBus defaultInstance;
private final Subject<Object, Object> bus;
// PublishSubject只会把在订阅发生的时间点之后来自原始Observable的数据发射给观察者
public RxBus() {
bus = new SerializedSubject<>(PublishSubject.create());
}
// 单例RxBus
public static RxBus getDefault() {
if (defaultInstance == null) {
synchronized (RxBus.class) {
if (defaultInstance == null) {
defaultInstance = new RxBus();
}
}
}
return defaultInstance ;
}
// 发送一个新的事件
public void post (Object o) {
bus.onNext(o);
}
// 根据传递的 eventType 类型返回特定类型(eventType)的 被观察者
public <T> Observable<T> toObservable (Class<T> eventType) {
return bus.ofType(eventType);
}
}
最简单的RXBUS实现
Subject有4个类型
PublishSubject
BehaviorSubject
ReplaySubject
AsyncSubject
PublishSubject的含义是:在订阅者订阅的时间点之后的数据发送给观察者
SerializedSubject
SerializedSubject extends Subject extends Observable implements Observer,既是观察内容,又是观察者,起到桥梁/数据转发的作用
注:
1、Subject同时充当了Observer和Observable的角色,Subject是非线程安全的,要避免该问题,需要将 Subject转换为一个 SerializedSubject ,上述RxBus类中把线程非安全的PublishSubject包装成线程安全的Subject。
2.CompositeSubscription
该对象作为subscription的容器,方便统一取消订阅
关于Subject
然后实现以下RXBUS基本操作
public class newRxJavaSix extends AppCompatActivity{
private int i = 0;
private List<Activity> mList = new ArrayList<>();
private CompositeSubscription allSubscription = new CompositeSubscription();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.wu_2016_10_12_b_rxsix);
onRxBus();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Arrays.asList("Alice", "Bob", "Charlie", "Dave").forEach(System.out::println);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
mList.forEach(newRxJavaSix::sayHello);
}
}
public void ClickRxBus(View v){
i++;
RxBusDemo.getInstance().send(i);
}
// :: 语法 s引用某个方法
private void onRxBus(){
final int[] array = new int[2];
Subscriber<Integer> subscriber = new Subscriber<Integer>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Logger.d("error"+e.toString());
i = 0;
// onRxBus();
// newRxJavaSix.this.onRxBus();
}
@Override
public void onNext(Integer integer) {
array[integer] = integer;
Logger.d("on next"+integer);
}
};
allSubscription.add(RxBusDemo.getInstance().toSubscription(Integer.class, subscriber));
}
private static void sayHello(Activity str) {
System.out.println("hello");
}
@Override
protected void onDestroy() {
super.onDestroy();
if (allSubscription != null && !allSubscription.isUnsubscribed())
allSubscription.unsubscribe();
System.out.print(Constant.BASE);
}
}
注:发生错误的时候会取消订阅的,所以可以在onError里面处理出现错误的情况,可以重新订阅。还有记得在onDestory里面需要取消订阅 避免内存泄露