自己写的RxBus,写的不是很好勿喷

原文地址:http://blog.csdn.net/BingHongChaZuoAn/article/details/52025343
在网上 看了很多资料,感觉rxjava这么好用,只是post一些东西,真的太浪费了,rxjava的精髓在线程池的管理。比如你请求一条网络信息,难道你还要new一个thread去请求,然后用rxbus去post数据么,太浪费了。所以干脆自己再搞一个封装,嘿嘿!
代码如下:

public class RxBus {

    private static RxBus instance;
    private static HashMap<String, Observable> obseverableMap;
    private static HashMap<String, HashMap<String, Observer>> obseverMap;
    private static HashMap<String, Observer> observerListMap;

    /**
     * 获取实例
     */
    public static synchronized RxBus getInstance() {

        if (instance == null) {
            instance = new RxBus();
        }
        return instance;
    }

    public RxBus() {
    }

    /**
     * 注册observable
     */
    public static void registerObservable(@NonNull String tag, @NonNull Observable observable) {
        if (obseverableMap == null) {
            obseverableMap = new HashMap<>();
        }

        if (obseverableMap.get(tag) != null) {
            try {
                throw new Exception("已经注册过了这个TAG!");
            } catch (Exception e) {
                e.printStackTrace();
            }
            return;
        }

        obseverableMap.put(tag, observable);
    }

    /**
     * 注册observer
     */
    public static void registerObserve(@NonNull String TAG1, @NonNull String TAG2, @NonNull Observer observer) {
        if (obseverMap == null) {
            obseverMap = new HashMap<>();
        }

        if (obseverMap.get(TAG1) == null) {
            observerListMap = new HashMap<>();
        }
        observerListMap.put(TAG2, observer);
        obseverMap.put(TAG1, observerListMap);
    }

    /**
     * 订阅,相当于post
     */
    public static void subcribe(@NonNull String TAG) {
        if (!checkSub(TAG))
            return;

        for (String key : obseverMap.get(TAG).keySet()) {
            Observer observer = obseverMap.get(TAG).get(key);
            obseverableMap.get(TAG)
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(observer);
        }

    }

    /**
     * 订阅,相当于post
     */
    public static void subcribe(@NonNull String TAG, Scheduler subScheduler, Scheduler obScheduler) {
        if (!checkSub(TAG))
            return;

        for (String key : obseverMap.get(TAG).keySet()) {

            Observer observer = obseverMap.get(TAG).get(key);
            obseverableMap.get(TAG)
                    .subscribeOn(subScheduler)
                    .observeOn(obScheduler)
                    .subscribe(observer);
        }

    }

    /**
     * 检查obsever和observable
     */
    private static boolean checkSub(@NonNull String TAG) {

        if (obseverableMap.get(TAG) == null) {

            try {
                throw new Exception("您还没有注册observerable");
            } catch (Exception e) {
                e.printStackTrace();
            }

            return false;
        }

        if (obseverMap.get(TAG).isEmpty()) {
            try {
                throw new Exception("您还没有注册observer");
            } catch (Exception e) {
                e.printStackTrace();
            }

            return false;
        }

        return true;

    }

    public static void unRegister(String TAG) {
        obseverableMap.get(TAG).unsubscribeOn(Schedulers.io());
    }

    public static void unRegister(String TAG, Scheduler scheduler) {
        obseverableMap.get(TAG).unsubscribeOn(scheduler);
    }

    public static void removeSub(String key1, String key2) {
        obseverableMap.remove(key1);
        obseverMap.get(key1).remove(key2);
        if (obseverMap.get(key1).isEmpty()) {
            obseverMap.remove(key1);
        }
    }

}

其实挺简单的,就不怎么讲解了,可能需要再优化下代码,你们将就着看吧!如果再关联上注解,是不是会觉得高大尚一点,哈哈。最基本的东西懂了就好了,没必要再写一遍注解吧!
本篇不同的地方在于,使用了rxjava的线程管理,你不要请求网络的时候再去创造一个线程了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值