新的應(yīng)用中用到了RxBus,這里簡(jiǎn)單敘述一下.
1.添加依賴
// RxJava 2
implementation'io.reactivex.rxjava2:rxjava:2.1.0'
implementation'io.reactivex.rxjava2:rxandroid:2.0.1'
2.寫單例RxBusUtil
這個(gè)util為什么要是單例的想必想用RxBus的自然一想就知道 ,單例模式就不贅述了,這里主要說明一下里面的方法
這里面最主要的是維護(hù)了一個(gè)map
private? ConcurrentHashMap<Object,List<Subject>>? subjectMapper = new? ConcurrentHashMap<>();//這里的subject是rxjava2里的
首先是注冊(cè)方法
public <T> Observable<T> register(@NonNull Object tag) {
????? List<Subject> subjects = subjectMapper.get(tag);//這里建議用對(duì)應(yīng)類的名字作為tag,方便管理,亂用的話也可以但是很容易混亂
????? if(subjects ==null) {//如果這個(gè)類目還沒有對(duì)應(yīng)接收的集合就新建一個(gè)
??????????? subjects = newArrayList<>();
??????????? subjectMapper.put(tag,subjects);
????? }
????? Subject<T> subject = PublishSubject.create();//注冊(cè)的都要建一個(gè)接收通知的對(duì)象
????? subjects.add(subject);//然后添加到對(duì)應(yīng)tag的序列中
????? return? subject;
}
然后是發(fā)送通知的方法
private void post(@NonNull Object tag,@NonNull Object content) {//要發(fā)送給哪個(gè)tag,內(nèi)容
????? List<Subject> subjects =subjectMapper.get(tag);//根據(jù)tag取出對(duì)應(yīng)接收者集合
????? if(!subjects.isEmpty()) {
???????????? for(Subject subject : subjects) {//循環(huán)發(fā)送
????????????????? subject.onNext(content);
??????????? }
????? }
}
發(fā)送時(shí)
RxBus.getInstance().post(TAG, bean);//tag就是要接收的地方當(dāng)時(shí)注冊(cè)的tag,因?yàn)槭荗bject類型,所以后面的內(nèi)容可以是bean類,boolean,String等,在接收的地方也會(huì)根據(jù)不同類型而接收
最后是反注冊(cè)方法
public void unregister(@NonNullObject tag,@NonNullObservable observable) {
????? List<Subject> subjects = subjectMapper.get(tag);
????? if(subjects != null) {
??????????? subjects.remove(observable);
??????????? if(subjects.isEmpty()) {//如果上面移除的是最后一個(gè),那么就清掉這個(gè)對(duì)應(yīng)的tag
???????????????? subjectMapper.remove(tag);
???????????? }
????? }
}
3.接收的部分
注冊(cè)后會(huì)返回的一個(gè)Observable對(duì)象
Observable<Boolean>? observable = RxBus.getInstance().register(TAG);//泛型自己定,這里用Boolean示范
observable.subscribe(newConsumer() {
????? @Override
?????? public voidaccept(Boolean boolean) throws Exception {
??????????? if(boolean) {
??????????? //接收到消息要做的事
??????????? }
????? }
});
希望讀的人有所收獲!!!