原文地址: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的线程管理,你不要请求网络的时候再去创造一个线程了。