项目重构经验三——Rxjava的使用,RxBus,RxManager,结合retrofit的使用

接下来讲的内容都是基于熟练使用Rxjava的基础上的,如果对于Rxjava不熟悉的话,请参考泡在网上的日子上的Rxjava专题

http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0430/2815.html

 

封装RxBus代替EventBus

public class RxBus {

    

private static RxBus instance;

 

    public static synchronized RxBus getInstance() {

        if (null == instance) {

            instance = new RxBus();

        }

        return instance;

    }

 

    private RxBus() {

    }

 

    @SuppressWarnings("rawtypes")

    private ConcurrentHashMap> subjectMapper = new ConcurrentHashMap>();

 

 

 

    /**

     * 注册事件源

     *

     * @param tag

     * @return

     */

    @SuppressWarnings({"rawtypes"})

    public Observable register(@NonNull Object tag) {

        List subjectList = subjectMapper.get(tag);

        if (null == subjectList) {

            subjectList = new ArrayList();

            subjectMapper.put(tag, subjectList);

        }

        Subject subject;

        subjectList.add(subject = PublishSubject.create());

        LogUtils.logd("register"+tag + "  size:" + subjectList.size());

        return subject;

    }

 

    /**

     * 取消监听

     *

     * @param tag

     * @param observable

     * @return

     */

    @SuppressWarnings("rawtypes")

    public RxBus unregister(@NonNull Object tag,

                            @NonNull Observable observable) {

        if (null == observable)

            return getInstance();

        List subjects = subjectMapper.get(tag);

        if (null != subjects) {

            subjects.remove((Subject) observable);

            if (isEmpty(subjects)) {

                subjectMapper.remove(tag);

                LogUtils.logd("unregister"+ tag + "  size:" + subjects.size());

            }

        }

        return getInstance();

    }

 

    /**

     * 触发事件

     *

     * @param content

     */

    @SuppressWarnings({"unchecked", "rawtypes"})

    public void post(@NonNull Object tag, @NonNull Object content) {

        LogUtils.logd("post"+ "eventName: " + tag);

        List subjectList = subjectMapper.get(tag);

        if (!isEmpty(subjectList)) {

            for (Subject subject : subjectList) {

                subject.onNext(content);

                LogUtils.logd("onEvent"+ "eventName: " + tag);

            }

        }

    }

 

    @SuppressWarnings("rawtypes")

    public static boolean isEmpty(Collection collection) {

        return null == collection || collection.isEmpty();

    }

 

}

 

使用单例模式,保证整个项目RxBus实例唯一,ConcurrentHashMap>是线程安全集合,keyObject类型的标签,用来存放对应的Subject集合,Subject同时充当了Observer和Observable的角色,Subject是非线程安全的,要避免该问题,需要将 Subject转换为一个 SerializedSubject ,一般可以这样转化

Subject bus = new SerializedSubject<>(PublishSubject.create());

但是ConcurrentHashMap的使用,就解决了Subject非线程安全的问题,只需要将Subject放在集合中对应的位置即可。

 

继续看RxManager类中是如何使用RxBus,从而RxBus事件总线和进行RxJava生命周期的统一管理。

 

/**
 * 用于管理单个presenterRxBus的事件和Rxjava相关代码的生命周期处理
 */

public class RxManager {

    public RxBus mRxBus = RxBus.getInstance();

    

//使用map管理rxbus订阅

    private Map> mObservables = new HashMap<>();

    

/*管理ObservablesSubscribers订阅,防止内存泄漏*/

    private CompositeSubscription mCompositeSubscription = new CompositeSubscription();

 

    /**

     * RxBus注入监听

     * @param eventName

     * @param action1

     */

    public void on(String eventName, Action1 action1) {

        Observable mObservable = mRxBus.register(eventName);

        mObservables.put(eventName, mObservable);

        /*订阅管理*/

         mCompositeSubscription.add(mObservable.observeOn(AndroidSchedulers.mainThread())

                .subscribe(action1, new Action1() {

                    @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> entry : mObservables.entrySet()) {

            mRxBus.unregister(entry.getKey(), entry.getValue());//移除rxbus观察

        }

    }

    

 

//发送rxbus

    public void post(Object tag, Object content) {

        mRxBus.post(tag, content);

    }

}


上述代码注释已经很详细了,现在来看项目中是如何使用RxManager来管理RxJava生命周期的


在BaseActivity和BaseFragment的onCreate()方法中进行RxManager的初始化,在onDestroy()方法中进行rxManager.clear(),Observables取消订阅和所有rxbus观察。

在BasePresenter中进行初始化,并且在onDestroy()中rxManager.clear(),该方法在和Activity,fragment的生命周期同步,即BaseActivity和BaseFragment的onCreate()方法中初始化,在onDestroy()方法中调用BasePresenter的onDestroy()方法,这样,rxJava生命周期和Activity,Fragment的生命周期同步,在使用时,只要调用rxManager.add()方法就可以进行RxJava的生命周期管理。在进行事件通信时,只要在接收方调用rxManager.on(tag,action1),tag使事件标签,用来管理rxbus订阅,action1是接收内容的回调。在发送方调用rxManager.post(tag,content),content就是发送的内容,具体看项目源码自行分析。


RxJava和Retrofit结合,参考 http://www.jianshu.com/p/2b0aeb6b6b61,本项目中,我个人认为封装的不好,一般公司项目都是使用post请求,很少使用get。这里我就不详细讲解了,但是这个网络框架现在很流行,必须熟练掌握。

你可能感兴趣的:(项目重构经验三——Rxjava的使用,RxBus,RxManager,结合retrofit的使用)