android之使用RxJava实现EventBus事件总线

1.引入依赖

//rxjava
implementation 'io.reactivex.rxjava2:rxjava:2.1.7'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'

2.RxBus代码

/**
 * 用RxJava实现EventBus
 */
public class RxBus {
    private static RxBus instance;
    private ConcurrentHashMap<Object,List<Subject>> subjectMapper=new ConcurrentHashMap<>();

    public static synchronized RxBus getInstance(){
        if (instance==null){
            instance=new RxBus();
        }
        return instance;
    }

    private RxBus(){}

    /**
     * 订阅事件源
     */
    public RxBus onEvent(Observable<?> mObservable, Consumer<Object> mAction1){
        mObservable.observeOn(AndroidSchedulers.mainThread()).subscribe(mAction1, new Consumer<Throwable>() {
            @Override
            public void accept(Throwable throwable) throws Exception {
                throwable.printStackTrace();
            }
        });
        return getInstance();
    }

    /**
     * 注册事件源
     */
    public <T> Observable<T> register(@NonNull Object tag){
        List<Subject> subjectList=subjectMapper.get(tag);
        if (subjectList==null){
            subjectList=new ArrayList<Subject>();
            subjectMapper.put(tag,subjectList);
        }
        Subject<T> subject;
        subjectList.add(subject=PublishSubject.<T>create());
        return subject;
    }

    public void unregister(@NonNull Object tag){
        List<Subject> subjects=subjectMapper.get(tag);
        if (subjects!=null){
            subjectMapper.remove(tag);
        }
    }

    /**
     * 取消监听
     */
    public RxBus unregister(@NonNull Object tag,@NonNull Observable<?> observable){
        if (observable==null){
            return getInstance();
        }
        List<Subject> subjects=subjectMapper.get(tag);
        if (subjects!=null){
            subjects.remove(observable);
            if (isEmpty(subjects)){
                subjectMapper.remove(tag);
            }
        }
        return getInstance();
    }

    public void post(@NonNull Object content){
        post(content.getClass().getName(),content);
    }

    /**
     * 触发事件
     */
    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);
            }
        }
    }

    public static boolean isEmpty(Collection<Subject> collection){
        return collection==null||collection.isEmpty();
    }
}

3.RxManager代码

/**
 * 用于管理单个presenter的RxBus的事件和RxJava相关代码的生命周期处理
 */
public class RxManager {
    public RxBus mRxBus=RxBus.getInstance();
    //管理rxbus订阅
    private Map<String,Observable<?>> mObservables=new HashMap<>();
    //管理Observables和Subscribers订阅
    private CompositeDisposable mCompositeDisposable=new CompositeDisposable();
    /**
     * RxBus注入监听
     */
    public <T> void on(String eventName, Consumer<T> action1){
        Observable<T> mObservable=mRxBus.register(eventName);
        mObservables.put(eventName,mObservable);
        Disposable subscription=mObservable.observeOn(AndroidSchedulers.mainThread())
                .subscribe(action1, new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {
                        throwable.printStackTrace();
                    }
                });
        //订阅管理
        mCompositeDisposable.add(subscription);
    }

    /**
     * 单纯的Observables 和 Subscribers管理
     */
    public void add(Disposable m){
        //订阅管理
        mCompositeDisposable.add(m);
    }

    /**
     * 单个presenter生命周期结束,取消订阅和所有rxbus观察
     */
    public void clear(){
        mCompositeDisposable.dispose();
        for (Map.Entry<String,Observable<?>> entry:mObservables.entrySet()){
            mRxBus.unregister(entry.getKey(),entry.getValue());// 移除rxbus观察
        }
    }

    public void unregister(String tag){
        Observable<?> observable=mObservables.remove(tag);
        if (observable!=null){
            mRxBus.unregister(tag,observable);//移除rxbus观察
        }
    }

    //发送rxbus
    public void post(Object tag,Object content){
        mRxBus.post(tag,content);
    }
}

4.消息类别

public class Constants {
    //event bus
    public static final String SEDN_MESSAGE = "send message";
}

5.BaseActivity

public abstract class BaseActivity extends AppCompatActivity {
    public RxManager mRxManager;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mRxManager=new RxManager();
        setContentView(getLayoutId());
        initPresenter();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mRxManager.clear();
    }

    /*********************
     * 子类实现
     *****************************/
    //简单页面无需mvp就不用管此方法即可,完美兼容各种实际场景的变通
    public abstract void initPresenter();

    //获取布局文件
    public abstract int getLayoutId();
}

6.使用方法(可发送对象和任何数据类型)

public class EventMsg {
    public String msg;
    public int year;
}


//发送消息
EventMsg eventMsg=new EventMsg();
eventMsg.msg="淡泊以明志,宁静以致远";
eventMsg.year=3;
mRxManager.post(Constants.SEDN_MESSAGE,eventMsg);


//在返回的ac中接收消息
mRxManager.on(Constants.SEDN_MESSAGE, new Consumer<Object>() {
      @Override
      public void accept(Object o) throws Exception {
           EventMsg eventMsg= (EventMsg) o;
           tv_text.setText(eventMsg.msg+eventMsg.year);
      }
});

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值