RxBus和RxManager管理rxJava的生命周期

  1. 首先使用rxjava封装了一个Rxbus
public class RxBus {
    private static final String TAG = RxBus.class.getSimpleName();
    private static   RxBus instance;
    public static boolean DEBUG = BuildConfig.LOG_DEBUG;
    private ConcurrentHashMap<Object, List<Subject>> subjectMapper = new ConcurrentHashMap<>();

    private RxBus() {
    }


    public static RxBus get() {
        if (null == instance) {
            synchronized (RxBus.class) {
                if (null == instance) {

                    instance = new RxBus();
                }
            }
        }
        return instance;
    }


    /**
     * rxBus的注册方法
     * @param tag
     * @param <T>
     * @return
     */
    @SuppressWarnings("unchecked")
    public <T> Observable<T> register(@NonNull Object tag) {
        //可以为同一个tag 注册多个
        List<Subject> subjectList = subjectMapper.get(tag);
        if (null == subjectList) {
            subjectList = new ArrayList<>();
            subjectMapper.put(tag, subjectList);
        }

        Subject<T, T> subject;
        //使用replaysubject 可以先发送事件,在订阅
        subjectList.add(subject = ReplaySubject.create());
        if (DEBUG) Log.d(TAG, "[register]subjectMapper: " + subjectMapper);
        return subject;
    }

    /**
     * rxBus的取消注册
     * @param tag
     * @param observable
     */
    public void unregister(@NonNull Object tag, @NonNull Observable observable) {
        List<Subject> subjects = subjectMapper.get(tag);
        if (null != subjects) {
            subjects.remove((Subject) observable);
            if (isEmpty(subjects)) {
                subjectMapper.remove(tag);
            }
        }

        if (DEBUG) Log.d(TAG, "[unregister]subjectMapper: " + subjectMapper);
    }

    /**
     * 发布事件
     * @param tag
     * @param content
     */
    @SuppressWarnings("unchecked")
    public void post(@NonNull Object tag, @NonNull Object content) {
        List<Subject> subjectList = subjectMapper.get(tag);

        if (!isEmpty(subjectList)) {
            //同一个tag 都发布事件
            for (Subject subject : subjectList) {
                subject.onNext(content);

            }
        }
        if (DEBUG) Log.d(TAG, "[send]subjectMapper: " + subjectMapper);
    }


    public boolean isEmpty(List list) {

        if (list != null) {
            if (list.size() == 0) {
                return true;
            } else {
                return false;
            }
        }
        return true;
    }
}

2.下面就RxManager的封装

public class RxManager {
    public RxBus mRxBus = RxBus.get(); //拿到rxBus
    //管理rxbus订阅
    private Map<String, Observable<?>> mObservables = new HashMap<>();
    /*管理Observables 和 Subscribers订阅*/
    private CompositeSubscription mCompositeSubscription = new CompositeSubscription();

    /**
     * RxBus订阅
     * @param eventName
     * @param action1
     */
    public <T>void on(String eventName, Action1<T> action1) {
        Observable<T> mObservable = mRxBus.register(eventName);
         mObservables.put(eventName, mObservable);

        /*订阅管理*/
        mCompositeSubscription.add(mObservable.observeOn(AndroidSchedulers.mainThread())
                .subscribe(action1, new Action1<Throwable>() {
                    @Override
                    public void call(Throwable throwable) {
                        //处理错误信息
                        throwable.printStackTrace();
                    }
                }));
    }

    /**
     * 单纯的Observables 和 Subscribers管理
     * @param m
     */
    public void add(Subscription m) {
        /*订阅管理*/
        mCompositeSubscription.add(m);
    }
    /**
     * 单个presenter生命周期结束,取消订阅和所有rxbus观察
     */
    public void clear() {
        mCompositeSubscription.unsubscribe();// 取消所有订阅
        for (Map.Entry<String, Observable<?>> entry : mObservables.entrySet()) {
            mRxBus.unregister(entry.getKey(), entry.getValue());// 移除rxbus观察
        }
        mObservables.clear();
        mObservables = null;
        mRxBus = null;
        mCompositeSubscription = null;
    }
    //发送rxbus
    public void post(Object tag, Object content) {
        mRxBus.post(tag, content);
    }

3.说一下使用的方法
一般我们都有BaseActivity,所以只要在BaseActivity里面创建好RxManager的对象,然后在onDestroy里面调用mRxManager.clear();在对应的子类activity中如果是要使用rxbus就只需要调用mRxManger.on(tag,Action1)方法就可以完成注册,使用普通的rxjava也只需要调用mRxManger.add()方法将创建的Observable添加进去即可.所有的rxjava的生命周期的管理就交给了RxManager

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值