新的應用中用到了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;
}
然后是發(fā)送通知的方法
private void post(@NonNull Object tag,@NonNull Object content) {//要發(fā)送給哪個tag,內(nèi)容
????? List<Subject> subjects =subjectMapper.get(tag);//根據(jù)tag取出對應接收者集合
????? if(!subjects.isEmpty()) {
???????????? for(Subject subject : subjects) {//循環(huán)發(fā)送
????????????????? subject.onNext(content);
??????????? }
????? }
}
發(fā)送時
RxBus.getInstance().post(TAG, bean);//tag就是要接收的地方當時注冊的tag,因為是Object類型,所以后面的內(nèi)容可以是bean類,boolean,String等,在接收的地方也會根據(jù)不同類型而接收
最后是反注冊方法
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) {
??????????? //接收到消息要做的事
??????????? }
????? }
});
希望讀的人有所收獲!!!