關(guān)于Android異步 RxJava和Handler

首先漓帅,異步就是你要獲得一個(gè)操作的結(jié)果锨亏,但是短時(shí)間內(nèi)不能得到,于是你就讓那個(gè)操作等得到結(jié)果的時(shí)候發(fā)個(gè)通知給你忙干,讓你知道已經(jīng)有結(jié)果了器予,這既是異步。
然后這幾天一直在看RxJava捐迫,就是處理Android異步操作的一個(gè)很簡(jiǎn)潔的庫(kù)劣摇。

RXJava

關(guān)于這個(gè)庫(kù),這篇文章講的很仔細(xì) 給Android開(kāi)發(fā)者的RxJava詳解弓乙。
摘了幾個(gè)重要的點(diǎn)出來(lái)末融。
Android 創(chuàng)造的AsyncTask和Handler,其實(shí)都是為了讓異步代碼更加簡(jiǎn)潔暇韧。RxJava 的優(yōu)勢(shì)也是簡(jiǎn)潔勾习,但它的簡(jiǎn)潔的與眾不同之處在于,隨著程序邏輯變得越來(lái)越復(fù)雜懈玻,它依然能夠保持簡(jiǎn)潔巧婶。

代碼例子

Observable.from(folders)
.flatMap(newFunc1>() {

@Override
public Observable call(Filefile) {

        return Observable.from(file.listFiles());
}
})
      .filter(newFunc1() {

@Override
public Boolean call(Filefile) {
returnfile.getName().endsWith(".png");
}
})
      .map(newFunc1() {

@Override
public Bitmap call(Filefile) {
      return getBitmapFromFile(file);
}
})
      .subscribeOn(Schedulers.io())
      .observeOn(AndroidSchedulers.mainThread())
      .subscribe(newAction1() {

@Override
public void call(Bitmap bitmap) {
      imageCollectorView.addImage(bitmap);
}
});

1 擴(kuò)展的觀察模式

然后看到這里才想起來(lái)之前原來(lái)是接觸過(guò)RxJava的,但是當(dāng)時(shí)沒(méi)用心理解涂乌。
觀察模式就是有一個(gè)Oberserver -- 觀察者和一個(gè)Observable -- 被觀察者艺栈,在這里,觀察者不用時(shí)時(shí)刻刻去檢查被觀察者的狀態(tài)湾盒,因?yàn)橹灰挥^察者結(jié)束了它的工作湿右,產(chǎn)生了觀察者需要的結(jié)果后,它會(huì)提醒觀察者罚勾, 方式稱(chēng)為“Subscribe”訂閱或者 “Register”注冊(cè)毅人。所以在這里吭狡,和往常的羅邏輯不通,這里是observable.subscribe(oberserver),看起來(lái)像是被觀察者訂閱了觀察者丈莺。這一模式和button的onclickLinsterner很相似划煮,按鈕被點(diǎn)擊,這個(gè)監(jiān)聽(tīng)器就會(huì)收到信號(hào)缔俄。

屏幕快照 2016-12-16 下午4.56.34.png

2 線程控制

實(shí)現(xiàn)異步至關(guān)重要的概念弛秋。
在不指定線程的情況下, RxJava 遵循的是線程不變的原則俐载,即:在哪個(gè)線程調(diào)用 subscribe()蟹略,就在哪個(gè)線程生產(chǎn)事件;在哪個(gè)線程生產(chǎn)事件瞎疼,就在哪個(gè)線程消費(fèi)事件。如果需要切換線程壁畸,就需要用到 Scheduler(調(diào)度器)贼急。也可以多次切換

  • Schedulers.immediate(): 直接在當(dāng)前線程運(yùn)行,相當(dāng)于不指定線程捏萍。這是默認(rèn)的 Scheduler太抓。
  • Schedulers.newThread(): 總是啟用新線程,并在新線程執(zhí)行操作令杈。
  • Schedulers.io(): I/O 操作(讀寫(xiě)文件走敌、讀寫(xiě)數(shù)據(jù)庫(kù)、網(wǎng)絡(luò)信息交互等)所使用的 Scheduler逗噩。行為模式和 newThread() 差不多掉丽,區(qū)別在于 io() 的內(nèi)部實(shí)現(xiàn)是是用一個(gè)無(wú)數(shù)量上限的線程池,可以重用空閑的線程异雁,因此多數(shù)情況下 io() 比 newThread() 更有效率捶障。不要把計(jì)算工作放在 io() 中,可以避免創(chuàng)建不必要的線程纲刀。
  • Schedulers.computation(): 計(jì)算所使用的 Scheduler项炼。這個(gè)計(jì)算指的是 CPU 密集型計(jì)算,即不會(huì)被 I/O 等操作限制性能的操作示绊,例如圖形的計(jì)算锭部。這個(gè) Scheduler 使用的固定的線程池,大小為 CPU 核數(shù)面褐。不要把 I/O 操作放在 computation() 中拌禾,否則 I/O 操作的等待時(shí)間會(huì)浪費(fèi) CPU。
  • 另外展哭, Android 還有一個(gè)專(zhuān)用的 AndroidSchedulers.mainThread()蹋砚,它指定的操作將在 Android 主線程運(yùn)行扼菠。

然后用subscribeOn()和oberserveOn()來(lái)調(diào)用以上的Scheduler
subscribeOn(): 指定 subscribe() 所發(fā)生的線程坝咐,即 Observable.OnSubscribe 被激活時(shí)所處的線程循榆。或者叫做事件產(chǎn)生的線程墨坚。

  • observeOn(): 指定 Subscriber 所運(yùn)行在的線程秧饮。或者叫做事件消費(fèi)的線程 泽篮。
  • suscribeOn(): 指定subscribe()發(fā)生的進(jìn)程盗尸,即observable.OnSubscribe()被激活時(shí)所處的進(jìn)程,或者叫做事件產(chǎn)生的進(jìn)程帽撑。
    例子:
屏幕快照 2016-12-16 下午5.10.08.png

3 變換

變換指的是將時(shí)間序列中的對(duì)象或者整個(gè)序列進(jìn)行加工處理泼各,轉(zhuǎn)換成不同的事件或者事件序列。

API

+ map()
+ flatMap()
+ compose()

4 在 doOnSubscribe()的后面跟一個(gè) subscribeOn() 亏拉,就能指定準(zhǔn)備工作的線程了赔嚎。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末颈嚼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌喘落,老刑警劉巖煤痕,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件念逞,死亡現(xiàn)場(chǎng)離奇詭異碾局,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)肋层,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門(mén)亿笤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人栋猖,你說(shuō)我怎么就攤上這事责嚷。” “怎么了掂铐?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵罕拂,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我全陨,道長(zhǎng)爆班,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任辱姨,我火速辦了婚禮柿菩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘雨涛。我一直安慰自己枢舶,他們只是感情好懦胞,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著凉泄,像睡著了一般躏尉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上后众,一...
    開(kāi)封第一講書(shū)人閱讀 49,730評(píng)論 1 289
  • 那天胀糜,我揣著相機(jī)與錄音,去河邊找鬼蒂誉。 笑死教藻,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的右锨。 我是一名探鬼主播括堤,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼绍移!你這毒婦竟也來(lái)了悄窃?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤登夫,失蹤者是張志新(化名)和其女友劉穎广匙,沒(méi)想到半個(gè)月后允趟,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體恼策,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年潮剪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了涣楷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡抗碰,死狀恐怖狮斗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情弧蝇,我是刑警寧澤碳褒,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站看疗,受9級(jí)特大地震影響沙峻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜两芳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一摔寨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧怖辆,春花似錦是复、人聲如沸删顶。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)逗余。三九已至,卻和暖如春蒋纬,著一層夾襖步出監(jiān)牢的瞬間猎荠,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工蜀备, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留关摇,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓碾阁,卻偏偏與公主長(zhǎng)得像输虱,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子脂凶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

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