新的应用中用到了RxBus,这里简单叙述一下.
1.添加依赖
// RxJava 2
implementation'io.reactivex.rxjava2:rxjava:2.1.0'
implementation'io.reactivex.rxjava2:rxandroid:2.0.1'
2.写单例RxBusUtil
这个util为什么要是单例的想必想用RxBus的自然一想就知道 ,单例模式就不赘述了,这里主要说明一下里面的方法
这里面最主要的是维护了一个map
private ConcurrentHashMap<Object,List<Subject>> subjectMapper = new ConcurrentHashMap<>();//这里的subject是rxjava2里的
首先是注册方法
public <T> Observable<T> register(@NonNull Object tag) {
List<Subject> subjects = subjectMapper.get(tag);//这里建议用对应类的名字作为tag,方便管理,乱用的话也可以但是很容易混乱
if(subjects ==null) {//如果这个类目还没有对应接收的集合就新建一个
subjects = newArrayList<>();
subjectMapper.put(tag,subjects);
}
Subject<T> subject = PublishSubject.create();//注册的都要建一个接收通知的对象
subjects.add(subject);//然后添加到对应tag的序列中
return subject;
}
然后是发送通知的方法
private void post(@NonNull Object tag,@NonNull Object content) {//要发送给哪个tag,内容
List<Subject> subjects =subjectMapper.get(tag);//根据tag取出对应接收者集合
if(!subjects.isEmpty()) {
for(Subject subject : subjects) {//循环发送
subject.onNext(content);
}
}
}
发送时
RxBus.getInstance().post(TAG, bean);//tag就是要接收的地方当时注册的tag,因为是Object类型,所以后面的内容可以是bean类,boolean,String等,在接收的地方也会根据不同类型而接收
最后是反注册方法
public void unregister(@NonNullObject tag,@NonNullObservable observable) {
List<Subject> subjects = subjectMapper.get(tag);
if(subjects != null) {
subjects.remove(observable);
if(subjects.isEmpty()) {//如果上面移除的是最后一个,那么就清掉这个对应的tag
subjectMapper.remove(tag);
}
}
}
3.接收的部分
注册后会返回的一个Observable对象
Observable<Boolean> observable = RxBus.getInstance().register(TAG);//泛型自己定,这里用Boolean示范
observable.subscribe(newConsumer() {
@Override
public voidaccept(Boolean boolean) throws Exception {
if(boolean) {
//接收到消息要做的事
}
}
});
希望读的人有所收获!!!
网友评论