Rxjava從入門到深入

RxJava的牛逼在哪里诸蚕?

1:提供了對事件序列進(jìn)行變換的支持

所謂變換踪宠,就是將事件序列中的對象或整個序列進(jìn)行加工處理,轉(zhuǎn)換成不同的事件或事件序列

2:實(shí)現(xiàn)了對線程的自由控制

通過Scheduler進(jìn)行對call()中發(fā)射數(shù)據(jù)的線程控制,subscribeOn(Schedulers.io()) 這個線程的核心底層是基于線程池來完成妈嘹,一定要清楚多線程與rxjava結(jié)合應(yīng)用

在不指定線程的情況下柳琢, RxJava 遵循的是線程不變的原則,即:在哪個線程調(diào)用 subscribe()润脸,就在哪個線程生產(chǎn)事件柬脸;在哪個線程生產(chǎn)事件,就在哪個線程消費(fèi)事件毙驯。如果需要切換線程倒堕,就需要用到 Scheduler (調(diào)度器)。

Scheduler調(diào)度器的api

在RxJava 中爆价,Scheduler ——調(diào)度器垦巴,相當(dāng)于線程控制器媳搪,RxJava 通過它來指定每一段代碼應(yīng)該運(yùn)行在什么樣的線程。RxJava 已經(jīng)內(nèi)置了幾個 Scheduler 骤宣,它們已經(jīng)適合大多數(shù)的使用場景:

  • Schedulers.immediate():
    直接在當(dāng)前線程運(yùn)行秦爆,相當(dāng)于不指定線程。這是默認(rèn)的 Scheduler憔披。

  • Schedulers.newThread():
    總是啟用新線程等限,并在新線程執(zhí)行操作。

  • Schedulers.io():
    I/O 操作(讀寫文件芬膝、讀寫數(shù)據(jù)庫望门、網(wǎng)絡(luò)信息交互等)所使用的 Scheduler。行為模式和 newThread() 差不多锰霜,區(qū)別在于 io() 的內(nèi)部實(shí)現(xiàn)是是用一個無數(shù)量上限的線程池筹误,可以重用空閑的線程,因此多數(shù)情況下 io() 比 newThread() 更有效率锈遥。不要把計算工作放在 io() 中纫事,可以避免創(chuàng)建不必要的線程。

  • Schedulers.computation()
    計算所使用的 Scheduler所灸。這個計算指的是 CPU 密集型計算丽惶,即不會被 I/O 等操作限制性能的操作,例如圖形的計算爬立。這個 Scheduler 使用的固定的線程池钾唬,大小為 CPU 核數(shù)。不要把 I/O 操作放在 computation() 中侠驯,否則 I/O 操作的等待時間會浪費(fèi) CPU抡秆。

另外, Android 還有一個專用的 AndroidSchedulers.mainThread()吟策,它指定的操作將在 Android 主線程運(yùn)行儒士。

有了這幾個 Scheduler ,就可以使用 subscribeOn() 和 observeOn() 兩個方法來對線程進(jìn)行控制了檩坚。

  • subscribeOn(): 指定 subscribe() 所發(fā)生的線程着撩,即Observable.OnSubscribe 被激活時所處的線程∝椅或者叫做事件產(chǎn)生的線程拖叙。

  • observeOn(): 指定 Subscriber 所運(yùn)行在的線程÷咐郑或者叫做事件消費(fèi)的線程薯鳍。

資料收集

Rxjava是什么

Rx其實(shí)就是一個使用可觀察數(shù)據(jù)流進(jìn)行異步編程的編程接口,結(jié)合了觀察者模式挨措、迭代器模式和函數(shù)式編程的精華挖滤。說白了就是針對一個數(shù)據(jù)流有著一套嚴(yán)格規(guī)范以及一套很牛逼的實(shí)現(xiàn)方式的一個庫崩溪。

Rx = Observables(數(shù)據(jù)源) + LINQ(各種操作) + Schedulers(調(diào)度器)

我們用個思維導(dǎo)圖來分辨一下:

常見操作分類.png

只看概念有點(diǎn)懵逼,是不是壶辜,沒關(guān)系悯舟!下面來實(shí)例詳細(xì)說明

Observable.from(folders)
    .flatMap(new Func1<File, Observable<File>>() {
        @Override
        public Observable<File> call(File file) {
            return Observable.from(file.listFiles());
        }
    })
    .filter(new Func1<File, Boolean>() {
        @Override
        public Boolean call(File file) {
            return file.getName().endsWith(".png");
        }
    })
    .map(new Func1<File, Bitmap>() {
        @Override
        public Bitmap call(File file) {
            return getBitmapFromFile(file);
        }
    })
    .subscribeOn(Schedulers.io())//上面的call()發(fā)生在IO線程里
    .observeOn(AndroidSchedulers.mainThread())//回調(diào)發(fā)生在主線程里
    .subscribe(new Action1<Bitmap>() {
        @Override
        public void call(Bitmap bitmap) {
            imageCollectorView.addImage(bitmap);
        }
    });

加載圖片將會發(fā)生在 IO 線程,而設(shè)置圖片則被設(shè)定在了主線程砸民。這就意味著抵怎,即使加載圖片耗費(fèi)了幾十甚至幾百毫秒的時間,也不會造成絲毫界面的卡頓岭参。

我們根據(jù)上面的思維導(dǎo)圖再來剖析一下這個例子:
看到這里應(yīng)該對Rx有個基本的了解了反惕!

Rxjava的核心原則觀察者模式

沒錯核心就是觀察者模式!在Rxjava的觀察者模式當(dāng)然也是演侯,Observable
(被觀察者)姿染、 Observer (觀察者),那么觀察者秒际,被觀察者也有了悬赏,還差一個溝通的橋梁那么 subscribe(訂閱)就來了,來實(shí)現(xiàn)訂閱關(guān)系娄徊。

來個實(shí)例

 Observable.just("android","java","c")
.observeOn(Schedulers.io())
.subscribe(new Subscriber<String>() {
            @Override
            public void onCompleted() {
                //這里當(dāng)onNext()執(zhí)行三遍后才會最終執(zhí)行到這里
            }

            @Override
            public void onError(Throwable e) {
                //onCompleted(),onError()是互斥事件
            }

            @Override
            public void onNext(String s) {
            Logger.e("======"+s);//會依次打印出
            }
        })

上面的實(shí)例中看到怎么沒有看到Observer (觀察者)闽颇,其實(shí)Subscriber就是Observer 的抽象類。下面看一下這三個方法

 Observable observable = Observable.create(new Observable.OnSubscribe<String>() {
    @Override
    public void call(Subscriber<? super String> subscriber) {
        subscriber.onNext("Hello");
        subscriber.onNext("Hi");
        subscriber.onNext("Aloha");
        subscriber.onCompleted();
    }
});

String[] words = {"Hello", "Hi", "Aloha"};
Observable observable = Observable.from(words);}

 Observable observable = Observable.just("Hello", "Hi", "Aloha");

上面三個方法其實(shí)都是一樣的寄锐,只不過下面兩個會依次調(diào)用

// 將會依次調(diào)用:
onNext("Hello");
onNext("Hi");
onNext("Aloha");
onCompleted();

下面來了解下Rxjava常見的操作處理分類

常見操作分類.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末兵多,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子橄仆,更是在濱河造成了極大的恐慌剩膘,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盆顾,死亡現(xiàn)場離奇詭異怠褐,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)您宪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門惫搏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蚕涤,你說我怎么就攤上這事∠承桑” “怎么了揖铜?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長达皿。 經(jīng)常有香客問我天吓,道長贿肩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任龄寞,我火速辦了婚禮汰规,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘物邑。我一直安慰自己溜哮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布色解。 她就那樣靜靜地躺著茂嗓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪科阎。 梳的紋絲不亂的頭發(fā)上述吸,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天,我揣著相機(jī)與錄音锣笨,去河邊找鬼蝌矛。 笑死,一個胖子當(dāng)著我的面吹牛错英,可吹牛的內(nèi)容都是我干的入撒。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼走趋,長吁一口氣:“原來是場噩夢啊……” “哼衅金!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起簿煌,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤氮唯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后姨伟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惩琉,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年夺荒,在試婚紗的時候發(fā)現(xiàn)自己被綠了瞒渠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡技扼,死狀恐怖伍玖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情剿吻,我是刑警寧澤窍箍,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響椰棘,放射性物質(zhì)發(fā)生泄漏纺棺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一邪狞、第九天 我趴在偏房一處隱蔽的房頂上張望祷蝌。 院中可真熱鬧,春花似錦帆卓、人聲如沸巨朦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽罪郊。三九已至,卻和暖如春尚洽,著一層夾襖步出監(jiān)牢的瞬間悔橄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工腺毫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留癣疟,地道東北人。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓潮酒,卻偏偏與公主長得像睛挚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子急黎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 作者寄語 很久之前就想寫一個專題扎狱,專寫Android開發(fā)框架,專題的名字叫 XXX 從入門到放棄 勃教,沉淀了這么久淤击,...
    戴定康閱讀 7,634評論 13 85
  • 我從去年開始使用 RxJava ,到現(xiàn)在一年多了故源。今年加入了 Flipboard 后污抬,看到 Flipboard 的...
    Jason_andy閱讀 5,493評論 7 62
  • 最近項(xiàng)目里面有用到Rxjava框架印机,感覺很強(qiáng)大的巨作,所以在網(wǎng)上搜了很多相關(guān)文章门驾,發(fā)現(xiàn)一片文章很不錯射赛,今天把這篇文...
    Scus閱讀 6,884評論 2 50
  • 文章轉(zhuǎn)自:http://gank.io/post/560e15be2dca930e00da1083作者:扔物線在正...
    xpengb閱讀 7,034評論 9 73
  • 淘洗無數(shù)遍再等喧囂褪去 閉口不談,骨頭就開始跳舞 它們沿著篝火脫離我 痛跳動到消腫奶是,勝于洗雪取暖 手指自詡為自由 ...
    丁千閱讀 48評論 0 0