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);
}
});