RxJava实现EventBus
1、创建RxBus :
public class RxBus {
private HashMap<Object, ArrayList<Subscriber>> subscriberMap = new HashMap<Object, ArrayList<Subscriber>>();
private static RxBus instance;
private RxBus(){
}
public static synchronized RxBus getInstance() {
if (null == instance) {
instance = new RxBus();
}
return instance;
}
/**
* 发送事件
*
* @param content
* @return 是件是否被接收
*/
public boolean send(Object content) {
return send(content.getClass().getName(), content);
}
public boolean send(Object tag, Object content) {
if (!subscriberMap.containsKey(tag)) {
return false;
}
ArrayList<Subscriber> subscribers = subscriberMap.get(tag);
for (Subscriber subscriber : subscribers) {
subscriber.onNext(content);
subscriber.onCompleted();
}
return true;
}
/**
* 注册观察者
*
* @param subscriber
* @return
*/
public boolean register(Subscriber subscriber, Object tag) {
if (subscriberMap.containsKey(tag)) {
ArrayList<Subscriber> subscribers = subscriberMap.get(tag);
if (subscribers.indexOf(subscriber) >= 0) {
return false;
} else {
subscribers.add(subscriber);
}
} else {
ArrayList<Subscriber> subscribers = new ArrayList<Subscriber>();
subscribers.add(subscriber);
subscriberMap.put(tag, subscribers);
}
return true;
}
/**
* 注销观察者
*
* @param subscriber
* @return
*/
public boolean unregister(Subscriber subscriber, Object tag) {
if (subscriberMap.containsKey(tag)) {
ArrayList<Subscriber> subscribers = subscriberMap.get(tag);
if (subscribers.indexOf(subscriber) < 0) {
return false;
} else {
subscribers.remove(subscriber);
if (subscribers.size() == 0) {
subscriberMap.remove(tag);
}
return true;
}
}
return false;
}
}
2、创建观察者,并注册
public Subscriber<Drawable> subscriber = new Subscriber<Drawable>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable throwable) {
}
@Override
public void onNext(Drawable drawable) {
image.setImageDrawable(drawable);
}
};
注册
RxBus.getInstance().register(subscriber,Drawable.class.getName());
3、事件发生绑定观察者:
Observable observable = Observable.create(new Observable.OnSubscribe<Drawable>() {
@Override
public void call(Subscriber<? super Drawable> subscriber) {
Drawable drawable = getTheme().getDrawable(R.mipmap.ic_launcher);
subscriber.onNext(drawable);
subscriber.onCompleted();
}
}).subscribeOn(Schedulers.io());
RxBus.getInstance().send(Drawable.class.getName(), drawable);