接下来讲的内容都是基于熟练使用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
/**
* 注册事件源
*
* @param tag
* @return
*/
@SuppressWarnings({"rawtypes"})
public
List
if (null == subjectList) {
subjectList = new ArrayList
subjectMapper.put(tag, subjectList);
}
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
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
if (!isEmpty(subjectList)) {
for (Subject subject : subjectList) {
subject.onNext(content);
LogUtils.logd("onEvent"+ "eventName: " + tag);
}
}
}
@SuppressWarnings("rawtypes")
public static boolean isEmpty(Collection
return null == collection || collection.isEmpty();
}
}
使用单例模式,保证整个项目RxBus实例唯一,ConcurrentHashMap
Subject
但是ConcurrentHashMap的使用,就解决了Subject非线程安全的问题,只需要将Subject放在集合中对应的位置即可。
继续看RxManager类中是如何使用RxBus,从而RxBus事件总线和进行RxJava生命周期的统一管理。
/** * 用于管理单个presenter的RxBus的事件和Rxjava相关代码的生命周期处理 */
public class RxManager {
public RxBus mRxBus = RxBus.getInstance();
//使用map管理rxbus订阅
private Map
/*管理Observables和Subscribers订阅,防止内存泄漏*/
private CompositeSubscription mCompositeSubscription = new CompositeSubscription();
/**
* RxBus注入监听
* @param eventName
* @param action1
*/
public
Observable
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
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。这里我就不详细讲解了,但是这个网络框架现在很流行,必须熟练掌握。