rxbus 源码_RxJava学习(四利用RxJava打造自己的RxBus)

1 package com.example.liujian.rxjavademo;2

3 import java.util.HashMap;4

5 import rx.Observable;6 import rx.Subscription;7 import rx.android.schedulers.AndroidSchedulers;8 import rx.functions.Action0;9 import rx.functions.Action1;10 import rx.schedulers.Schedulers;11 import rx.subjects.PublishSubject;12 import rx.subjects.SerializedSubject;13 import rx.subscriptions.CompositeSubscription;14

15 /**16 * @project_Name: RxjavaDemo17 * @package: com.example.liujian.rxjavademo18 * @description: 使用Rxjava,RxAndroid实现RxBus19 * @author: liujian20 * @date: 2016/10/5 11:0821 * @version: V1.022 */

23

24 public classRxBus {25 private static volatileRxBus mInstance;26 //Subject继承了Observable类又实现了Observer接口, Subject可以同时担当订阅者和被订阅者的角色

27 private SerializedSubjectmSubject;28 //一个类产生多个Subscription对象,用一CompositeSubscription 存储起来,以进行批量的取消订阅。避免内存泄漏

29 private HashMapmSubscriptionHashMap;30 privateRxBus(){31 //Subject是非线程安全的,SerializedSubject将PublishSubject 转换成一个线程安全的Subject对象

32 mSubject=new SerializedSubject<>(PublishSubject.create());33 }34 public staticRxBus getInstance(){35 if(mInstance==null){36 synchronized (RxBus.class){37 if(mInstance==null){38 mInstance=newRxBus();39 }40 }41 }42 returnmInstance;43 }44 /**45 * 发生消息46 */

47 public voidpost(Object o){48 mSubject.onNext(o);49 }50

51 /**52 * 返回指定类型的Observable实例53 * @param type:要处理的消息的类型54 * @param 55 * @return56 */

57 public Observable toObservable(final Classtype){58 returnmSubject.ofType(type);59 }60

61 /**62 * 是否已含有观察者订阅63 * @return64 */

65 publicboolean hasObservers(){66 returnmSubject.hasObservers();67 }68

69 /**70 * 默认的订阅方法71 * @param 72 * @return73 */

74 public Subscription doSubscribe(Class type, Action1next){75 returntoObservable(type)76 .subscribeOn(Schedulers.io())77 .observeOn(AndroidSchedulers.mainThread())78 .subscribe(next);79 }80 /**81 * 默认的订阅方法82 * @param 83 * @return84 */

85 public Subscription doSubscribe(Class type, Action1 next,Action1error){86 returntoObservable(type)87 .subscribeOn(Schedulers.io())88 .observeOn(AndroidSchedulers.mainThread())89 .subscribe(next,error);90 }91 /**92 * 默认的订阅方法93 * @param 94 * @return95 */

96 public Subscription doSubscribe(Class type, Action1 next, Action1error, Action0 complete){97 returntoObservable(type)98 .subscribeOn(Schedulers.io())99 .observeOn(AndroidSchedulers.mainThread())100 .subscribe(next,error,complete);101 }102

103 /**104 * 保存订阅后的subscription,方便一次性取消订阅105 * @param o106 * @param subscription107 */

108 public voidaddSubscription(Object o,Subscription subscription){109 if(mSubscriptionHashMap==null){110 mSubscriptionHashMap=new HashMap<>();111 }112 String key=o.getClass().getSimpleName();113 if(mSubscriptionHashMap.containsKey(key)){114 mSubscriptionHashMap.get(key).add(subscription);115 }else{116 CompositeSubscription compositeSubscription=newCompositeSubscription();117 compositeSubscription.add(subscription);118 mSubscriptionHashMap.put(key,compositeSubscription);119 }120 }121

122 /**123 * 取消订阅124 * @param o125 */

126 public voidunSubscribe(Object o){127 if(mSubscriptionHashMap==null){128 return;129 }130 String key=o.getClass().getSimpleName();131 if(!mSubscriptionHashMap.containsKey(key)){132 return;133 }134 if(mSubscriptionHashMap.get(key)!=null){135 mSubscriptionHashMap.get(key).unsubscribe();136 }137 mSubscriptionHashMap.remove(key);138 }139 }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值