RxBus基本使用詳解

ReactiveX

是一個專注于異步編程與控制可觀察數(shù)據(jù)(或者事件)流的API。它組合了觀察者模式徐裸,迭代器模式和函數(shù)式編程的優(yōu)秀思想女器。
實時數(shù)據(jù)處理是一件普通的現(xiàn)象诀蓉,有一個高效犯助、干凈和可擴展的方式來處理這些情景是重要的癣漆。使用 Observables 和 Operators 來熟練操作它們。ReactiveX 提供一個可組合又靈活的 API 來創(chuàng)建和處理數(shù)據(jù)流剂买,同時簡化了異步編程帶來的一些擔(dān)憂扑媚,如:線程創(chuàng)建和并發(fā)問題。

RxJava 簡介

是 ReactiveX 在 Java 上的開源的實現(xiàn)雷恃。Observable(觀察者) 和 Subscriber(訂閱者)是兩個主要的類。在 RxJava 上费坊,一個 Observable 是一個發(fā)出數(shù)據(jù)流或者事件的類倒槐,Subscriber 是一個對這些發(fā)出的 items (數(shù)據(jù)流或者事件)進行處理(采取行動)的類。一個 Observable 的標(biāo)準(zhǔn)流發(fā)出一個或多個 item附井,然后成功完成或者出錯讨越。一個 Observable 可以有多個 Subscribers两残,并且通過 Observable 發(fā)出的每一個 item,該 item 將會被發(fā)送到 Subscriber.onNext() 方法來進行處理把跨。一旦 Observable 不再發(fā)出 items人弓,它將會調(diào)用 Subscriber.onCompleted() 方法,或如果有一個出錯的話 Observable 會調(diào)用 Subscriber.onError() 方法着逐。

以前我們要想在activity或fragment之間傳遞信息崔赌,我們會通過onActvityResult接收信息。但是這樣有一個缺點耸别,一個是代碼量太大健芭,重復(fù)率太高。二是有時候傳遞的數(shù)據(jù)需要經(jīng)過幾個界面的跳轉(zhuǎn)秀姐。加入從A->B->C慈迈,C界面修改了某些信息,同時省有,想在A界面進行界面的刷新痒留。那么通過onActvityResult的話很難操作。還有就是蠢沿,加入從A->B伸头,B傳遞信息給A界面。以往通過onActvityResult搏予,我們需要在B界面關(guān)閉的時候熊锭,A界面才能拿到數(shù)據(jù),再進行局部刷新雪侥,這樣的話碗殷,A界面很可能會閃爍(數(shù)據(jù)刷新)。這樣的話用戶體驗感就很差了速缨。

使用方法

首先锌妻,附上RxJava/RxAndroid的導(dǎo)包連接,也可以去gitHub上添加最新的版本鏈接

implementation 'io.reactivex:rxandroid:1.2.1'
implementation 'io.reactivex:rxjava:1.2.4'

首要要創(chuàng)建一個RxBus類旬牲,來實現(xiàn)基本的方法封裝仿粹,下面貼出來一個簡單示例:

public class RxBus {

    private static volatile RxBus instance;

    private Subject<Object , Object> bus;

    /**
     * PublishSubject只會把在訂閱發(fā)生的時間點之后來自原始Observable的數(shù)據(jù)發(fā)射給觀察者
     */
    public RxBus () {
        bus = new SerializedSubject<>(PublishSubject.create());
    }
    public static RxBus getDefault(){
        if (instance ==null){
            synchronized (RxBus .class){
                if (instance == null){
                    instance = new RxBus ();
                }
            }
        }
        return instance;
    }
    /**
     * 發(fā)送一個新的事件
     * @param object
     */
    public void post(Object object){
        bus.onNext(object);
    }

    /**
     * 根據(jù)傳遞的 eventType 類型返回特定類型(eventType)的 被觀察者
     */
    public <T> Observable<T> toObservable(Class<T> eventType){
        return bus.ofType(eventType);
    }
}

完成上面一個小示例的封裝,那么怎么來使用呢原茅?
要在我們使用的位置要進行訂閱吭历,添加訂閱之后,這樣就可以接受其他位置發(fā)來的數(shù)據(jù)data了擂橘。

RxBus.getDefault().toObservable(RxBusXunHeBean.class)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1<RxBusXunHeBean>() {
            @Override
            public void call(Bean mBean) {
            //此處的bean就是攜帶數(shù)據(jù)的實體晌区,可以是你想要的任何數(shù)據(jù)類型,都是沒有問題的。
            }
        });

攜帶數(shù)據(jù)的實體Bean朗若,我就不在此處貼代碼了恼五,要是有不懂的話初學(xué)者,可以留言或者微信聯(lián)系我哭懈。
最后一步灾馒,有了攜帶數(shù)據(jù)的實體,又有了接受數(shù)據(jù)的位置遣总,接下來睬罗,就是數(shù)據(jù)的發(fā)送了,因為RxBus中封裝了post方法彤避,在此處傅物,我們直接調(diào)用就可以了。

public class Test1Activity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test1);
        initView();
    }

    private void initView() {
        Bean bean= new Bean("android-RxBus","不一樣的煙火");
        RxBus.getDefault().post(bean);
    }
}

以上琉预,就是一個很簡單的RxBus的使用方法了董饰,歡迎大家批評指正。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載圆米,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者卒暂。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市娄帖,隨后出現(xiàn)的幾起案子也祠,更是在濱河造成了極大的恐慌,老刑警劉巖近速,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诈嘿,死亡現(xiàn)場離奇詭異,居然都是意外死亡削葱,警方通過查閱死者的電腦和手機奖亚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來析砸,“玉大人昔字,你說我怎么就攤上這事∈追保” “怎么了作郭?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長弦疮。 經(jīng)常有香客問我夹攒,道長,這世上最難降的妖魔是什么胁塞? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任芹助,我火速辦了婚禮堂湖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘状土。我一直安慰自己,他們只是感情好伺糠,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布蒙谓。 她就那樣靜靜地躺著,像睡著了一般训桶。 火紅的嫁衣襯著肌膚如雪累驮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天舵揭,我揣著相機與錄音谤专,去河邊找鬼。 笑死午绳,一個胖子當(dāng)著我的面吹牛置侍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拦焚,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蜡坊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了赎败?” 一聲冷哼從身側(cè)響起秕衙,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎僵刮,沒想到半個月后据忘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡搞糕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年勇吊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寞宫。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡萧福,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出辈赋,到底是詐尸還是另有隱情鲫忍,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布钥屈,位于F島的核電站悟民,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏篷就。R本人自食惡果不足惜射亏,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧智润,春花似錦及舍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至兼蜈,卻和暖如春攘残,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背为狸。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工歼郭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人辐棒。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓病曾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親涉瘾。 傳聞我的和親對象是個殘疾皇子知态,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355