RxBus

packagecom.jaydenxiao.common.baserx;

importjava.util.HashMap;

importjava.util.Map;

importrx.Observable;

importrx.Subscription;

importrx.android.schedulers.AndroidSchedulers;

importrx.functions.Action1;

importrx.subscriptions.CompositeSubscription;

/**

* 用于管理單個presenter的RxBus的事件和Rxjava相關代碼的生命周期處理

* Created by xsf

* on 2016.08.14:50

*/

public classRxManager {

publicRxBusmRxBus= RxBus.getInstance();

//管理rxbus訂閱

privateMap>mObservables=newHashMap<>();

/*管理Observables 和 Subscribers訂閱*/

privateCompositeSubscriptionmCompositeSubscription=newCompositeSubscription();

/**

* RxBus注入監(jiān)聽

*@parameventName

*@paramaction1

*/

publicvoidon(String eventName,Action1 action1) {

Observable mObservable =mRxBus.register(eventName);

mObservables.put(eventName,mObservable);

/*訂閱管理*/

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

.subscribe(action1, newAction1() {

@Override

public voidcall(Throwable throwable) {

throwable.printStackTrace();

}

}));

}

/**

* 單純的Observables 和 Subscribers管理

*@paramm

*/

public voidadd(Subscription m) {

/*訂閱管理*/

mCompositeSubscription.add(m);

}

/**

* 單個presenter生命周期結束崭篡,取消訂閱和所有rxbus觀察

*/

public voidclear() {

mCompositeSubscription.unsubscribe();// 取消所有訂閱

for(Map.Entry> entry :mObservables.entrySet()) {

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

}

}

//發(fā)送rxbus

public voidpost(Object tag,Object content) {

mRxBus.post(tag,content);

}

}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

packagecom.jaydenxiao.common.baserx;

importandroid.support.annotation.NonNull;

importcom.jaydenxiao.common.commonutils.LogUtils;

importjava.util.ArrayList;

importjava.util.Collection;

importjava.util.List;

importjava.util.concurrent.ConcurrentHashMap;

importrx.Observable;

importrx.Subscriber;

importrx.android.schedulers.AndroidSchedulers;

importrx.functions.Action1;

importrx.subjects.PublishSubject;

importrx.subjects.Subject;

/**

* 用RxJava實現(xiàn)的EventBus

* Created by xsf

* on 2016.08.14:50

*/

public classRxBus {

private staticRxBusinstance;

public static synchronizedRxBusgetInstance() {

if(null==instance) {

instance=newRxBus();

}

returninstance;

}

privateRxBus() {

}

@SuppressWarnings("rawtypes")

privateConcurrentHashMap>subjectMapper=newConcurrentHashMap>();

/**

* 訂閱事件源

*

*@parammObservable

*@parammAction1

*@return

*/

publicRxBusOnEvent(Observable mObservable,Action1 mAction1) {

mObservable.observeOn(AndroidSchedulers.mainThread()).subscribe(mAction1, newAction1() {

@Override

public voidcall(Throwable throwable) {

throwable.printStackTrace();

}

});

returngetInstance();

}

/**

* 注冊事件源

*

*@paramtag

*@return

*/

@SuppressWarnings({"rawtypes"})

public Observableregister(@NonNullObject tag) {

List subjectList =subjectMapper.get(tag);

if(null== subjectList) {

subjectList =newArrayList();

subjectMapper.put(tag,subjectList);

}

Subject subject;

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

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

returnsubject;

}

@SuppressWarnings("rawtypes")

public voidunregister(@NonNullObject tag) {

List subjects =subjectMapper.get(tag);

if(null!= subjects) {

subjectMapper.remove(tag);

}

}

/**

* 取消監(jiān)聽

*

*@paramtag

*@paramobservable

*@return

*/

@SuppressWarnings("rawtypes")

publicRxBusunregister(@NonNullObject tag,

@NonNullObservable observable) {

if(null== observable)

returngetInstance();

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

}

}

returngetInstance();

}

public voidpost(@NonNullObject content) {

post(content.getClass().getName(),content);

}

/**

* 觸發(fā)事件

*

*@paramcontent

*/

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

public voidpost(@NonNullObject tag,@NonNullObject 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 booleanisEmpty(Collection collection) {

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

}

}

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市梁肿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖春宣,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件巨朦,死亡現(xiàn)場離奇詭異送矩,居然都是意外死亡向挖,警方通過查閱死者的電腦和手機蝌以,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來户誓,“玉大人饼灿,你說我怎么就攤上這事〉勖溃” “怎么了?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵晤硕,是天一觀的道長悼潭。 經(jīng)常有香客問我,道長舞箍,這世上最難降的妖魔是什么舰褪? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮疏橄,結果婚禮上占拍,老公的妹妹穿的比我還像新娘略就。我一直安慰自己,他們只是感情好晃酒,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布表牢。 她就那樣靜靜地躺著,像睡著了一般贝次。 火紅的嫁衣襯著肌膚如雪崔兴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天蛔翅,我揣著相機與錄音敲茄,去河邊找鬼。 笑死山析,一個胖子當著我的面吹牛堰燎,可吹牛的內容都是我干的。 我是一名探鬼主播笋轨,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼秆剪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了翩腐?” 一聲冷哼從身側響起鸟款,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎茂卦,沒想到半個月后何什,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡等龙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年处渣,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛛砰。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡罐栈,死狀恐怖,靈堂內的尸體忽然破棺而出泥畅,到底是詐尸還是另有隱情荠诬,我是刑警寧澤,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布位仁,位于F島的核電站柑贞,受9級特大地震影響,放射性物質發(fā)生泄漏聂抢。R本人自食惡果不足惜钧嘶,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望琳疏。 院中可真熱鬧有决,春花似錦闸拿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至按咒,卻和暖如春迟隅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背励七。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工智袭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人掠抬。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓吼野,卻偏偏與公主長得像,于是被迫代替她去往敵國和親两波。 傳聞我的和親對象是個殘疾皇子瞳步,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內容

  • 通過 RxJava 實現(xiàn)RxBus 1.添加依賴: compile'io.reactivex:rxjava:1.0...
    行而上學閱讀 812評論 0 0
  • 新的應用中用到了RxBus,這里簡單敘述一下. 1.添加依賴 // RxJava 2implementation'...
    沐沐小風閱讀 471評論 1 0
  • 前一階段,組內做技術分享腰奋,我給大家分享了RxJava的使用单起。在分享的時候,這次分享也是我對RxJava一個快速學習...
    wenju_song閱讀 1,930評論 4 9
  • 簡要說明 關于RxJava:https://github.com/ReactiveX/RxJava關于EventB...
    料峭寒閱讀 3,798評論 1 24
  • EventBus是什么 EventBus是為Android優(yōu)化的發(fā)布/訂閱事件總線 [圖片上傳失敗...(imag...
    小甜李子閱讀 1,159評論 1 1