摘要:響應(yīng)式編程在介紹前,我們先聊聊響應(yīng)式編程。響應(yīng)式編程的一個(gè)關(guān)鍵概念是事件。今天,響應(yīng)式編程最通用的一個(gè)場(chǎng)景是我們的移動(dòng)必須做出對(duì)網(wǎng)絡(luò)調(diào)用用戶(hù)觸摸輸入和系統(tǒng)彈框的響應(yīng)。并于年二月份正式向外展示了。
轉(zhuǎn)載請(qǐng)注明出處:https://zhuanlan.zhihu.com/p/20687178
RxJava系列1(簡(jiǎn)介)
RxJava系列2(基本概念及使用介紹)
RxJava系列3(轉(zhuǎn)換操作符)
RxJava系列4(過(guò)濾操作符)
RxJava系列5(組合操作符)
RxJava系列6(從微觀角度解讀RxJava源碼)
RxJava系列7(最佳實(shí)踐)
前言提升開(kāi)發(fā)效率,降低維護(hù)成本一直是開(kāi)發(fā)團(tuán)隊(duì)永恒不變的宗旨。近一年來(lái)國(guó)內(nèi)的技術(shù)圈子中越來(lái)越多的開(kāi)始提及Rx,經(jīng)過(guò)一段時(shí)間的學(xué)習(xí)和探索之后我也深深的感受到了RxJava的魅力。它能幫助我們簡(jiǎn)化代碼邏輯,提升代碼可讀性。這對(duì)于開(kāi)發(fā)效率的提升、后期維護(hù)成本的降低幫助都是巨大的。個(gè)人預(yù)測(cè)RxJava一定是2016年的一個(gè)大趨勢(shì),所以也有打算將它引入到公司現(xiàn)有的項(xiàng)目中來(lái),寫(xiě)這一系列的文章主要也是為了團(tuán)隊(duì)內(nèi)部做技術(shù)分享。
響應(yīng)式編程由于我本人是個(gè)Android程序猿,因此這一系列文章中的場(chǎng)景都是基于Android平臺(tái)的。如果你是個(gè)Java Web工程師或者是其它方向的那也沒(méi)關(guān)系,我會(huì)盡量用通俗的語(yǔ)言將問(wèn)題描述清楚。
在介紹RxJava前,我們先聊聊響應(yīng)式編程。那么什么是響應(yīng)式編程呢?響應(yīng)式編程是一種基于異步數(shù)據(jù)流概念的編程模式。數(shù)據(jù)流就像一條河:它可以被觀測(cè),被過(guò)濾,被操作,或者為新的消費(fèi)者與另外一條流合并為一條新的流。
響應(yīng)式編程的一個(gè)關(guān)鍵概念是事件。事件可以被等待,可以觸發(fā)過(guò)程,也可以觸發(fā)其它事件。事件是唯一的以合適的方式將我們的現(xiàn)實(shí)世界映射到我們的軟件中:如果屋里太熱了我們就打開(kāi)一扇窗戶(hù)。同樣的,當(dāng)我們的天氣app從服務(wù)端獲取到新的天氣數(shù)據(jù)后,我們需要更新app上展示天氣信息的UI;汽車(chē)上的車(chē)道偏移系統(tǒng)探測(cè)到車(chē)輛偏移了正常路線(xiàn)就會(huì)提醒駕駛者糾正,就是是響應(yīng)事件。
今天,響應(yīng)式編程最通用的一個(gè)場(chǎng)景是UI:我們的移動(dòng)App必須做出對(duì)網(wǎng)絡(luò)調(diào)用、用戶(hù)觸摸輸入和系統(tǒng)彈框的響應(yīng)。在這個(gè)世界上,軟件之所以是事件驅(qū)動(dòng)并響應(yīng)的是因?yàn)楝F(xiàn)實(shí)生活也是如此。
RxJava的來(lái)歷本章節(jié)中部分概念摘自《RxJava Essentials》一書(shū)
Rx是微軟.Net的一個(gè)響應(yīng)式擴(kuò)展,Rx借助可觀測(cè)的序列提供一種簡(jiǎn)單的方式來(lái)創(chuàng)建異步的,基于事件驅(qū)動(dòng)的程序。2012年Netflix為了應(yīng)對(duì)不斷增長(zhǎng)的業(yè)務(wù)需求開(kāi)始將.NET Rx遷移到JVM上面。并于13年二月份正式向外展示了RxJava。
從語(yǔ)義的角度來(lái)看,RxJava就是.NET Rx。從語(yǔ)法的角度來(lái)看,Netflix考慮到了對(duì)應(yīng)每個(gè)Rx方法,保留了Java代碼規(guī)范和基本的模式。
那么到底什么是RxJava呢?我對(duì)它的定義是:RxJava本質(zhì)上是一個(gè)異步操作庫(kù),是一個(gè)能讓你用極其簡(jiǎn)潔的邏輯去處理繁瑣復(fù)雜任務(wù)的異步事件庫(kù)。
RxJava好在哪Android平臺(tái)上為已經(jīng)開(kāi)發(fā)者提供了AsyncTask,Handler等用來(lái)做異步操作的類(lèi)庫(kù),那我們?yōu)槭裁催€要選擇RxJava呢?答案是簡(jiǎn)潔!RxJava可以用非常簡(jiǎn)潔的代碼邏輯來(lái)解決復(fù)雜問(wèn)題;而且即使業(yè)務(wù)邏輯的越來(lái)越復(fù)雜,它依然能夠保持簡(jiǎn)潔!再配合上Lambda用簡(jiǎn)單的幾行代碼分分鐘就解決你負(fù)責(zé)的業(yè)務(wù)問(wèn)題。簡(jiǎn)直逼格爆表,拿它裝逼那是極好的!
多說(shuō)無(wú)益,上代碼!
假設(shè)我們安居客用戶(hù)App上有個(gè)需求,需要從服務(wù)端拉取上海浦東新區(qū)塘橋板塊的所有小區(qū)Community[] communities,每個(gè)小區(qū)下包含多套房源List
new Thread() { @Override public void run() { super.run(); //從服務(wù)端獲取小區(qū)列表 Listcommunities = getCommunitiesFromServer(); for (Community community : communities) { List houses = community.houses; for (House house : houses) { if (house.price >= 5000000) { runOnUiThread(new Runnable() { @Override public void run() { //將房子的信息添加到屏幕上 addHouseInformationToScreen(house); } }); } } } } }.start();
使用RxJava的寫(xiě)法是這樣的:
Observable.from(getCommunitiesFromServer()) .flatMap(new Func1>() { @Override public Observable call(Community community) { return Observable.from(community.houses); } }).filter(new Func1 () { @Override public Boolean call(House house) { return house.price>=5000000; } }).subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1 () { @Override public void call(House house) { //將房子的信息添加到屏幕上 addHouseInformationToScreen(house); } });
從上面這段代碼我們可以看到:雖然代碼量看起來(lái)變復(fù)雜了,但是RxJava的實(shí)現(xiàn)是一條鏈?zhǔn)秸{(diào)用,沒(méi)有任何的嵌套;整個(gè)實(shí)現(xiàn)邏輯看起來(lái)異常簡(jiǎn)潔清晰,這對(duì)我們的編程實(shí)現(xiàn)和后期維護(hù)是有巨大幫助的。特別是對(duì)于那些回調(diào)嵌套的場(chǎng)景。配合Lambda表達(dá)式還可以簡(jiǎn)化成這樣:
Observable.from(getCommunitiesFromServer()) .flatMap(community -> Observable.from(community.houses)) .filter(house -> house.price>=5000000).subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(this::addHouseInformationToScreen);
簡(jiǎn)潔!有美感!這才是一個(gè)有情懷的程序員應(yīng)該寫(xiě)出來(lái)的代碼。
看完這篇文章大家應(yīng)該能夠理解RxJava為什么會(huì)越來(lái)越火了。它能極大的提高我們的開(kāi)發(fā)效率和代碼的可讀性!當(dāng)然了RxJava的學(xué)習(xí)曲線(xiàn)也是比較陡的,在后面的文章我會(huì)對(duì)主要的知識(shí)點(diǎn)做詳細(xì)的介紹,敬請(qǐng)關(guān)注!
如果大家喜歡這一系列的文章,歡迎關(guān)注我的知乎專(zhuān)欄和GitHub。
知乎專(zhuān)欄:https://zhuanlan.zhihu.com/baron
GitHub:https://github.com/BaronZ88
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/66516.html
摘要:之前寫(xiě)過(guò)一系列的文章,也承諾過(guò)會(huì)盡快有的介紹。所以這次還是給大家分享一個(gè)使用解決問(wèn)題的案例,希望對(duì)大家在使用的時(shí)候有一點(diǎn)點(diǎn)啟發(fā)。上述這一套復(fù)雜的業(yè)務(wù)邏輯如果使用傳統(tǒng)編碼方式將是極其復(fù)雜的。 之前寫(xiě)過(guò)一系列RxJava1的文章,也承諾過(guò)會(huì)盡快有RxJava2的介紹。無(wú)奈實(shí)際項(xiàng)目中還未真正的使用RxJava2,不敢妄動(dòng)筆墨。所以這次還是給大家分享一個(gè)使用RxJava1解決問(wèn)題的案例,希望對(duì)...
摘要:按照計(jì)劃這一期是要介紹框架結(jié)構(gòu)和設(shè)計(jì)思想的,但是考慮到將在十月底發(fā)布正式版因此決定將框架結(jié)構(gòu)和設(shè)計(jì)思想分析放到正式版發(fā)布后再做。后續(xù)我也會(huì)有一系列的文章來(lái)介紹和的區(qū)別。首選我們需要調(diào)用系統(tǒng)來(lái)獲取所有已安裝的,所以在的方法中調(diào)用。 轉(zhuǎn)載請(qǐng)注明出處:[https://zhuanlan.zhihu.com/p/... RxJava系列1(簡(jiǎn)介) RxJava系列2(基本概念及使用介紹) R...
閱讀 2306·2021-11-23 09:51
閱讀 3781·2021-10-20 13:49
閱讀 1777·2021-09-06 15:13
閱讀 1882·2021-09-06 15:02
閱讀 3354·2021-09-02 15:11
閱讀 962·2019-08-29 15:37
閱讀 1801·2019-08-29 13:24
閱讀 2323·2019-08-29 11:28