技术专栏
自定义RxBus,RxManager with RxJava2
现在查到的关于RxBus, RxManager的封装大部分是基于RxJava1的,从RxJava1到RxJava2的变化很大,很难平滑地过度,所以自己根据RxJava2重新封装下RxBus和RxManager
RxBus.java
public class RxBus {
private static RxBus instance;
/**
* ConcurrentHashMap: 线程安全集合
* Subject 同时充当了Observer和Observable的角色
*/
@SuppressWarnings("rawtypes")
private ConcurrentHashMap<Object, List<Subject>> subjectMapper = new ConcurrentHashMap<>();
public static synchronized RxBus getInstance() {
if(null == instance) {
instance = new RxBus();
}
return instance;
}
private RxBus() {
}
/**
* 订阅事件源
*
* @param observable
* @param consumer
* @return
*/
public RxBus onEvent(Observable<?> observable, Consumer<Object> consumer) {
observable.observeOn(AndroidSchedulers.mainThread())
.subscribe(consumer, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
throwable.printStackTrace();
}
});
return getInstance();
}
/**
* 注册事件源
*
* @param tag key
* @param <T>
* @return
*/
@SuppressWarnings({"rawtypes"})
public <T> Observable<T> register(@NonNull Object tag) {
List<Subject> subjectList = subjectMapper.get(tag);
if(null == subjectList) {
subjectList = new ArrayList<>();
subjectMapper.put(tag, subjectList);
}
Subject<T> subject = PublishSubject.create();
subjectList.add(subject);
// LogUtil.log("register" + tag + " size:" + subjectList.size());
return subject;
}
/**
* 取消整个tag的监听
*
* @param tag key
*/
@SuppressWarnings("rawtypes")
public void unregister(@NonNull Object tag) {
List<Subject> subjectList = subjectMapper.get(tag);
if(null != subjectList) {
subjectMapper.remove(tag);
}
}
/**
* 取消tag里某个observable的监听
*
* @param tag key
* @param observable 要删除的observable
* @return
*/
@SuppressWarnings("rawtypes")
public RxBus unregister(@NonNull Object tag,
@NonNull Observable<?> observable) {
if(null == observable) {
return getInstance();
}
List<Subject> subjectList = subjectMapper.get(tag);
if(null != subjectList) {
// 从subjectList中删去observable
subjectList.remove((Subject<?>) observable);
// 若此时subjectList为空则从subjectMapper中删去
if(isEmpty(subjectList)) {
subjectMapper.remove(tag);
}
}
return getInstance();
}
/**
* 触发事件
*
* @param content
*/
public void post(@NonNull Object content) {
post(content.getClass().getName(), content);
}
/**
* 触发事件
*
* @param tag key
* @param content
*/
@SuppressWarnings({"unchecked", "rawtypes"})
public void post(@NonNull Object tag, @NonNull Object content) {
List<Subject> subjectList = subjectMapper.get(tag);
if(!isEmpty(subjectList)) {
for(Subject subject : subjectList) {
subject.onNext(content);
}
}
}
/**
* 判断集合是否为空
*
* @param collection 集合
* @return
*/
@SuppressWarnings("rawtypes")
public static boolean isEmpty(Collection<Subject> collection) {
return null == collection || collection.isEmpty();
}
}
RxManager.java
public class RxManager {
public RxBus mRxBus = RxBus.getInstance();
/**
- 管理观察源
*/
private Map<String, Observable<?>> mObservableMap = new HashMap<>();
/**
- 管理订阅者
*/
private CompositeDisposable mCompositeSubscription = new CompositeDisposable();
public void on(String eventName, Consumer
mObservableMap.put(eventName, mObservable);
mCompositeSubscription
.add(mObservable.observeOn(AndroidSchedulers.mainThread())
.subscribe(consumer, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
throwable.printStackTrace();
}
}));
}
/**
- 添加订阅者到mCompositeSubscription
- @param m 要添加的订阅者
*/
public void add(Disposable m) {
mCompositeSubscription.add(m);
}
/**
- 取消所有注册
*/
public void clear() {
// 取消订阅
mCompositeSubscription.dispose();
for(Map.Entry<String, Observable<?>> entry : mObservableMap.entrySet()) {
// 取消注册
mRxBus.unregister(entry.getKey(), entry.getValue());
}
}
/**
- 触发事件
- @param tag
- @param content
*/
public void post(Object tag, Object content) {
mRxBus.post(tag, content);
}
原文链接:点击这里
声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包
点赞
收藏
评论
打赏
- 分享
- 举报
评论
0个
手气红包
暂无数据
相关专栏
-
浏览量:2183次2020-08-03 12:02:37
-
浏览量:3785次2020-09-20 21:19:24
-
浏览量:15168次2020-11-12 21:55:56
-
浏览量:5822次2020-09-23 23:07:37
-
浏览量:1825次2020-08-03 12:01:28
-
浏览量:8121次2020-12-12 17:55:00
-
浏览量:33919次2021-03-03 17:25:19
-
浏览量:4857次2021-06-28 15:59:34
-
浏览量:4382次2021-09-13 13:47:51
-
浏览量:2041次2020-08-03 13:33:48
-
浏览量:2963次2020-05-06 15:52:54
-
浏览量:13977次2021-08-13 16:08:47
-
浏览量:2782次2020-08-14 18:40:18
-
浏览量:4807次2021-09-08 16:03:36
-
浏览量:1164次2024-02-28 16:15:25
-
浏览量:1243次2023-09-07 09:50:10
-
浏览量:1006次2023-12-19 17:38:07
-
浏览量:2257次2020-08-20 11:19:28
-
浏览量:6006次2021-03-12 17:53:28
置顶时间设置
结束时间
删除原因
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
打赏作者
TT_123456789
您的支持将鼓励我继续创作!
打赏金额:
¥1
¥5
¥10
¥50
¥100
支付方式:
微信支付
打赏成功!
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
审核成功
发布时间设置
发布时间:
请选择发布时间设置
是否关联周任务-专栏模块
审核失败
失败原因
请选择失败原因
备注
请输入备注