rxjava essentials中文翻譯是對Ivan Morgillo所寫一書的僅供交流_第1頁
rxjava essentials中文翻譯是對Ivan Morgillo所寫一書的僅供交流_第2頁
rxjava essentials中文翻譯是對Ivan Morgillo所寫一書的僅供交流_第3頁
rxjava essentials中文翻譯是對Ivan Morgillo所寫一書的僅供交流_第4頁
rxjava essentials中文翻譯是對Ivan Morgillo所寫一書的僅供交流_第5頁
已閱讀5頁,還剩154頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

arningReactiveProgramming》。《RxJavaEssentials》翻譯中文版RX-from.NETto本章帶你進入reactive的世界。我們會比較reactive法和傳統(tǒng)方法,進而探索它們之間的相似和不同的地WhyoReactive本章會利用我們所學(xué)的知識來創(chuàng)建第一個reactiveAndroid應(yīng)Filtering的值,如何獲得一個有限的數(shù)值,如何處理溢出的場景,以及有用的技巧。TransformingbiningSchedulers-DefeatingtheAndroidMainThread本章將介紹如何使用RxJavaSchedulers程和并發(fā)編程。我們也將用reactive的方式來創(chuàng)建網(wǎng)絡(luò)操RESTinpeace-RxJavaand本章你如何讓Square公司的Retrofit和RxJava結(jié)合來一起使用,來創(chuàng)建一個更高效的REST客戶端程序為了能夠運行例子,你需要一個標(biāo)準(zhǔn)的Android開發(fā)環(huán)境AndroidStudio或InlijAndroidJava作為一個純粹的Java開發(fā)者,當(dāng)你接觸RxJava時,很明顯你需要一個你喜歡Java編輯器和一個標(biāo)準(zhǔn)的JavaJDK環(huán)境。這本一些圖表來自ht 和。如果你是一名有經(jīng)驗的Java開發(fā)者,reactive本書將幫助你學(xué)習(xí)RxJava的方面,也能幫助你克服Android平臺局限性從而創(chuàng)一個基于Androi應(yīng)用。itterhandles:“正如你看到的那樣:zip()有三個參數(shù):兩個Observable和一個Func2”如下面的一塊代publicpublicObservable<List<User>>getMostPopularSOusers(inthowmany){returnmStackExchangeService}publicpublicObservable<List<User>>getMostPopularSOusers(inthowmany){returnmStackExchangeService }在文本中:“WewilljustneedafancyprogressbarandaDOWNLOADbutton.Tip類似這樣的是提示和技發(fā)送郵件到 在你的郵件中要提到書的標(biāo)題 的賬戶中所有你Packt的的樣例代碼,如果你從別處購 /support并將文件用附件直接發(fā)給你。說RxJavaEssentials中文翻譯 前 第1章RxJavaEssentials中文翻譯版........8第1章本書內(nèi)容有.......第1章學(xué)習(xí)這本書你需要做的:.......第1章這本書適合哪些人看.........第1章一些約定........第1章讀者反饋........第1章樣例代碼........第2章RX.NET到RxJava.....微軟響應(yīng)式擴展來到Java世界-NetflixRxJavaRxJava的與眾不同之處總結(jié)第3章為什么是Observables?........觀察者模式你什么時候使用RxJava觀察者模Observable...................................Subject=Observable+Observer.........................總結(jié)第4章向響應(yīng)式世界問好......啟動工具我們的第一個Observable從列表創(chuàng)建一個Observable再多總結(jié)第5章過濾Observables......過濾獲取我們需要的有且Firstandlast.................................SkipandSkist................................ElementAt....................................Sampling....................................Timeout.....................................Debounce....................................總結(jié)第6章轉(zhuǎn)換Observables......*map.GroupBy.....................................Buffer.....................................Window.....................................Cast......................................總結(jié)第7章組合Observables......Merge...................................... combineLatest..................................And,Then和WhenSwitch.....................................StartWith....................................總結(jié)第8章Schedulers-解決Android主線程問題......StrictMode...................................避免阻塞I/O的操作Schedulers...................................非阻塞I/O操作SubscribeOnandObserveOn............................處理耗時的任務(wù)執(zhí)行總結(jié)第9章與REST無縫結(jié)合-RxJava和Retrofit....項目Retrofit....................................創(chuàng)建RecyclerViewAdapter總結(jié)1RxJavaEssentials中文翻1RxJavaEssentials文翻譯版|arningReactiveProgramming》?!禦xJavaEssentials》翻1章本書內(nèi)容有|1本章帶你進入reactive的世界。我們會比較reactive法和傳統(tǒng)方法,進而探索它們之間的相似和不同的地2.Why3.oReactive本章會利用我們所學(xué)的知識來創(chuàng)建第一個reactiveAndroid應(yīng)4.Filtering的值,如何獲得一個有限的數(shù)值,如何處理溢出的場景,以及有用的技巧。5.Transformingbining7.Schedulers-DefeatingtheAndroidMainThread本章將介紹如何使用RxJavaSchedulers來處理多線程和并發(fā)編程。我們也將用reactive的方式來創(chuàng)建網(wǎng)絡(luò)操 本 11習(xí)這本書你需要做的|1AndroidStudio或InlijAndroidJava作為一個純粹的Java開發(fā)者,當(dāng)你接觸RxJava時,很明顯你需要一個你喜歡Java編輯器和一個標(biāo)準(zhǔn)的JavaJDK環(huán) 11本書適合哪些人看|1如果你是一名有經(jīng)驗的Java開發(fā)者,reactive本書將幫助你學(xué)習(xí)RxJava的方面,也能幫助你克服Android平臺局限性從而創(chuàng)一個基于驅(qū)動的,響應(yīng)式的流暢體驗的Androi應(yīng)用。第1章一些第1章一些約定|1itterhandles:“正如你看到的那樣:zip()有三個參數(shù):兩個Observable和一個Func2”如下面的一塊代publicpublicObservable<List<User>>getMostPopularSOusers(inthowmany){returnmStackExchangeService}publicpublicObservable<List<User>>getMostPopularSOusers(inthowmany){returnmStackExchangeService }在文本中:“WewilljustneedafancyprogressbarandaDOWNLOADbutton.Tip類似這樣的是提示和技第1章讀者第1章讀者反饋|1發(fā)送郵件到 在你的郵件中要提到書的標(biāo)題 第1章樣例代碼|第1章樣例代 的賬戶中所有你Packt的的樣例代碼,如果你從別處購 說RxJavaEssentials中文翻譯版交流學(xué)習(xí)使用,嚴(yán)禁商業(yè)用途 2RX-從.NET到響應(yīng)式編程的一個關(guān)鍵概念是??梢员坏却梢杂|發(fā)過程,也可以觸發(fā)其它。是唯一的以合子表(變化的)中的一數(shù)值時,我們需更新整表格或者我們的機器人碰到時會轉(zhuǎn)彎(響應(yīng))。應(yīng)。在上,軟件之所以是驅(qū)動并響應(yīng)的是因為現(xiàn)實生活也是如此。微軟響應(yīng)式函數(shù)響應(yīng)式編程是一個來自90年代后期受微軟的一名計算機科學(xué)家ErikMeijer啟發(fā)的思想,用來設(shè)計和開發(fā)微軟Rx是微軟.NET的一個響應(yīng)式展。Rx借助可觀的序列供一種簡單的方式來創(chuàng)建異的,基于驅(qū)的程序。開發(fā)者可以使用ObservalesLNQ語法查詢Observables發(fā)。Rxush塞編程。下表列出的與.NET枚舉相關(guān)的.NET.NETpush通知即可。開發(fā)者對即將發(fā)的提供一個晰的響鏈。對于每一個,開發(fā)都作出相應(yīng)的響;例如,用被要登錄時候提交一攜帶的用名的單。用程執(zhí)行錄的網(wǎng)請求接下要發(fā)生的情況有:顯示一個成功的信息,并保存用戶的個人信顯示一個錯誤的正如你用push方法所看到的,開發(fā)者不需要等待結(jié)果。而是在結(jié)果返回時通知他。在這期間,他可以做他顯示一個進度預(yù)加載一些他認為登錄成功后需要耗時處理來到Java世界NetflixNetflix在2012年始他的架要滿他們大用戶群已經(jīng)得步維艱因此他決定新設(shè)構(gòu)來減少RESTREST調(diào)用。為了實現(xiàn)這一目標(biāo),他們決定嘗試響應(yīng)式,開始將.NETRx遷移到JVM上面。他們不想只基于Java語言;而是整個J2013年二月份,BenChristensenJafarHusain發(fā)在Netflix技術(shù)博客的一篇文章第一次向世界展示了RxJava。易于有條件的異一種更好的方式來避免回調(diào)一種響應(yīng)式方法正如.NET,RxJavaObservable是push迭代的等價體,即pull。pull方法是阻塞并等待的方法:消費者從pulpush方法作用于訂閱和響應(yīng):消費者訂閱新值的發(fā)射,當(dāng)它們可用時生產(chǎn)者push點上,消費者消費了它們。pushRxJava的與眾不同之處從純Java的觀點看,RxJavaObservable類源自于經(jīng)典的GangOfFour的觀察者模式。生產(chǎn)者在沒有數(shù)據(jù)可用時能夠發(fā)出信號通知 RxJavaObservables能夠組合而不是嵌套,從而避免開發(fā)者陷入回調(diào)Observables和 bles共用一個相似的API:我們在 ble可以執(zhí)行的許多操作也都同樣可以在上執(zhí)行。當(dāng)然,由于Observables流的本質(zhì),沒有如 ble.remove()這樣相應(yīng)的方法T Future<T>Observable<T>從語義的角度來看,RxJava就是.NETRx。從語法的角度來看,Netflix考慮到了對應(yīng)每個Rx方法,保留了Java代碼總下一章,學(xué)習(xí)到Observables是什么,以及如何創(chuàng)建它并把響應(yīng)式編程應(yīng)用到我們的日常編碼中去3為什么是可以被測試、復(fù)用和。設(shè)計這種系統(tǒng)就帶來一個棘手的影響:相關(guān)對象之間的統(tǒng)一。在SmalltalkMVC架構(gòu)中,創(chuàng)建模式的第一個例子就是用來解決這個問題的。用戶界面框架提供一種途徑使UI元素在本章中,會對觀察者模式有一個概述,它是如何實現(xiàn)的以及如何用RxJava來擴展,Observable是什么,以及Observables如何與Ibles相關(guān)聯(lián)。觀察者3D一的意義都取決于一組要展示的數(shù)。每一都是一個觀察者,都依賴于一個subject,信息。3D柱狀圖這個類、餅狀圖類、表這個類以及這些數(shù)據(jù)的類是完全解耦的:它們彼此相互獨立復(fù)用,但也能上面這展示了一個Subjet為3個Observers供服務(wù)很明顯,沒有理由去限制Obsrvers要,一個SubjectObservers,當(dāng)sbjectObserves你什么時候使用觀察者模RxJava觀察者模式在RxJava的世界里,我們有四種角色:*Observable*Observer*Subscriber*Subjects當(dāng)我們異步執(zhí)行一些復(fù)雜的事情,Java提供了傳統(tǒng)的類,例如Thread、 來處理這些問題。當(dāng)復(fù)雜度提升,這些方案就會變得麻煩和難以。最糟糕的是,它們都不支持鏈?zhǔn)秸{(diào)用RxJavaObservables值流,你都可以使用Observale。Observable的生命周期包含了三種可能的易于與Ible生命周期相比較的,下表展示了如何將Observableasync/push與Iblesync/pull相關(guān)聯(lián)起來。I檢索T發(fā)現(xiàn)throws完 使用Ible時,消費者從生產(chǎn)者那里以同步的方式得到值,在這些值得到之前線程處于阻塞狀態(tài)。相反,使用bservable時,生產(chǎn)者以異步的方式把值推給觀察者,無論何時,這些值都是可用的。這種方法之所以更靈活是因為了更好地復(fù)用Ible接口,RxJavaObservable類擴展了GOF觀察者模式的語義。引入了兩個新的接口:*onCompleted()即通知觀察者Observable沒有的數(shù)據(jù)。*onError()即觀察者有錯誤出現(xiàn)了。熱Observables和冷從發(fā)射物的角度來看,有兩種不同的Observables:熱的和冷的。一個"熱"的Observable始發(fā)射數(shù)據(jù),因此所有后續(xù)訂閱它的觀察者可能從序列中間的某個位置開始接受數(shù)據(jù)(有一些數(shù)據(jù)錯過了)個"冷"的Observable據(jù)序列。創(chuàng)建一個Observable.OnSubscribe<Object>(){publicvoidcall(Subscriber<?superObject>subscriber)}ObservableObservable<Integer>observableString=Observable.create(new{publicvoidcall(Subscriber<?superInteger>{for(inti=0;i<5;i++){}}SubscriptionsubscriptionPrint=observableString.subscribe(new{public {System.out.println("Observable}publicvoidonError(Throwable{System.out.println("Oh,no!Somethingwronghappened!}publicvoidonNext(Integer{System.out.println("Itemis"+}我們創(chuàng)建一個新的Observable<Integer>,它執(zhí)行了5個元素的for循環(huán),一個接一個的發(fā)射他們另一方面,我們訂閱了Obserable,返回一個Suscriptin***如果錯誤發(fā)生了,我們就打印ListList<Integer>items=newArrayList<Integer>();Observable<Integer>observableString=SubscriptionsubscriptionPrint=observableString.subscribe(new{public {System.out.println("Observable}publicvoidonError(Throwable{System.out.println("Oh,no!Somethingwronghappened!}publicvoidonNext(Integer{System.out.println("Itemis"+}from()創(chuàng)建符可以從一個列表/數(shù)組來創(chuàng)建Observable,并一個接一個的從列表/數(shù)組中發(fā)射出來每一個對象,者也可以從JavaFuture類來創(chuàng)建Observable,并發(fā)射Future對象的.get()方法返回的結(jié)果值。傳入Future為參數(shù)時,我們可以指定一個超時的值。Observable將等待來自Future的結(jié)果;如果在超時之前仍然沒有結(jié)回,Observable將會觸發(fā)onError()方法通知觀察者有錯誤發(fā)生了如果我們已經(jīng)有了一個傳統(tǒng)的Java函數(shù),我們想把它轉(zhuǎn)變?yōu)橐粋€Observable又改怎么辦呢?我們可以用e()方法,正如我們先前看到的,或者我們也可以像下面那樣使用以此來省去許多模ObservableObservable<String>observableString= SubscriptionsubscriptionPrint=observableString.subscribe(new{public {System.out.println("Observable}publicvoidonError(Throwable{System.out.println("Oh,no!Somethingwrong}publicvoidonNext(String{}privateprivateoWorld(){return oWorld";不管怎樣,它可以是我們想要的任何函數(shù)。在剛才的例子中,我們一旦創(chuàng)建了Observable,just()執(zhí)行函數(shù),當(dāng)just方法可以傳入一到九個參數(shù),它們會按照傳入的參數(shù)的順序來發(fā)射它們。just方法也可以接受列表數(shù)組,就像frm()定義好的值時會用到它。但是如果我們的函數(shù)不是時變性的,我們可以用just來創(chuàng)建一個更有組織性和可測性的代碼庫。最后注意just()創(chuàng)建符,它發(fā)射出值后,Observable正常結(jié)束,在上面那個例子中,我們會在控制臺打印出兩條信息:“oWorld”和“Observablecompleted”。Observable.empty(),Observable.never(),和當(dāng)我們需要一個Observable毫無理由的不再發(fā)射數(shù)據(jù)正常結(jié)束時,我們可以使用empty()。我們可以使用never()創(chuàng)建一個不發(fā)射數(shù)據(jù)并且也不會結(jié)束的Observable。我們也可以使用throw()創(chuàng)建一個不發(fā)射數(shù)據(jù)并且Subject=Observable+subject是一個神奇的對象,它可以是一個Observable同時也可以是一個Observer:它作為連接這兩個世界的一一旦Subject訂閱了Observabe,它將會觸發(fā)ObsrvableObservale訂閱一個“熱”的Observabl變量產(chǎn)生影響。RxJava提供四種不同的Subject:*PublishSubject*BehaviorSubject*ReySubject.* oWorldPublishSubjectPublishSubject<String>stringPublishSubject=SubscriptionsubscriptionPrint=stringPublishSubject.subscribe(new{public {System.out.println("Observable}publicvoidonError(Throwable{System.out.println("Oh,no!Somethingwrong}publicvoidonNext(String{} oPubishubjctreat()StrnglishSubject果subject沒有發(fā)值那么們的觀察者就會一直在等待再次的是,需擔(dān)最后一行代碼展示了手動發(fā)射字符串“oWorld”,它觸發(fā)了觀察者的onNext()方法,讓我們在控制臺打印出“oWorld”信息。讓我們看一個更復(fù)雜的例子。話說我們有一個private的Observable,外部不能。Observable在它生命首先,我們創(chuàng)建一個新的PublishSubject來響應(yīng)它的onNext()方法,并且外部也可以它finalfinalPublishSubject<Boolean>subject={public pleted()}publicvoidonError(Throwablee)}publicvoidonNext(Boolean{System.out.println("Observable}{publicvoidcall(Subscriber<?superInteger>{for(inti=0;i<5;i++){}} {publicvoid{}Observable.create()方法包含了我們熟悉的for循環(huán),發(fā)射數(shù)字 pleted()方法指定當(dāng)Observable結(jié)時要做什么事情:在subject上發(fā)射true。最后,我們訂閱了Observable。很明顯,空的subscribe調(diào)用僅僅是為了開啟Observable,而不用管已發(fā)出的任何值,也不用管完成或者錯誤。為了這個例子我們需要它像簡單的說,BehaviorSubject會首先向他的訂閱者發(fā)送截至訂閱前的一個數(shù)據(jù)對象(或初始值),然后正常發(fā)BehaviorSubjectBehaviorSubject<Integer>behaviorSubject=射的數(shù)據(jù),所以它需要一個初始值。 ySubject<Integer> ySubject= AsyncSubjectAsyncSubject<Integer>asyncSubject=總下一章中,創(chuàng)建第一個基于RxJava的Android應(yīng)用程序,學(xué)習(xí)如何檢索數(shù)據(jù)來填充listview,以及探索如何4向響應(yīng)式世界中,用我們到的來建我們第一個響應(yīng)式Androi應(yīng)用程序。首先,們需要搭建環(huán)境,導(dǎo)入需要的庫有用的庫。然后創(chuàng)一個簡單的應(yīng)用程序,在不的flavors中包含個用Java填充的RecycleViewitem。啟動使用InliJIDEA/AndroidStudio來創(chuàng)建這個工程,因此你會對截圖看起來比較熟悉如果你想用AndroidStudio創(chuàng)建一個新的工程,通常你可以參考文檔:依很明顯 RxAndroid是RxJava的部分。它基于RxJav1.0.x,普通的RxJava基上添了幾有用類。多數(shù)情下,它為Android添加了特的調(diào)度器。第七章Shedulers-DefeatingtheAndridMainThreadIssue再討論它。工出于實用,我們引入了LombokButterKnife。這兩個可以幫助我們在Android應(yīng)用程序中少寫許多模板類代Lombok使用注解的方式為你生成許多代碼。使用它老生成getter/setter、toString()、equals()、hashCode()。它借助于Gradle依賴和一個AndroidStudio插件。ButterButterKnife使用注解的方式來幫助我們免去寫findViewById()和設(shè)置點擊的痛苦。至于Lombok,我們可以通過導(dǎo)入依賴和安裝AndroidStudio插件來獲得更好的體驗。最后,我們導(dǎo)入Retrolambda,是因為我們開發(fā)的Android是基于Java1.6,然后我們可以借助它來實現(xiàn)Java8La我們的第一個在我們的第一個列子里,檢索安裝的應(yīng)用列表并填充RecycleView的item來展示它們。我們也設(shè)想一個下拉privateprivateObservable<AppInfo>getApps(){returnObservable.create(subscriber->{List<AppInfoRich>apps=newfinalIntentmainIntent=newIntent(Intent.ACTION_MAIN,null);List<ResolveInfo>infos=getActivity().getPackageManager().queryIntentActivities(mainIntent,0);for(ResolveInfoinfo:infos){apps.add(new}for(AppInfoRichappInfo:apps)Bitmapicon=Utils.drawableToBitmap(appInfo.getIcon());Stringname=appInfo.getName();StringiconPath=mFilesDir+"/"+name;(subscriber.isUnsubscribed()){retu}subscriber.onNext(new} @Accessors(prefix=publicclassAppInfoimplementsComparable<Object>StringmName;StringpublicAppInfo(StringnName,longlastUpdateTime,String{mName=nName;mIcon=icon;mLastUpdateTime=}publicpublicintcompareTo(Object{AppInfof=return}}此時,我們可以訂閱Observable并觀察它。訂閱一個Observable意味著當(dāng)我們需要的數(shù)據(jù)進來時須提供對listst展示一個錯誤的信息。使用ButterKnife,我們得到list和下拉刷新組件的RecyclerViewmRecycleView;SwipeRefreshLayoutmSwipeRefreshLayout;我們使用Android5的標(biāo)準(zhǔn)組件:RecyclerView和SwipeRefreshLayout。截屏展示了我們這個簡單App的listFragprivateprivatevoid{.subscribe(newObserver<List<AppInfo>>()publicpleted()Toast.makeText(getActivity(),"Hereisthelist!",}publicvoidonError(Throwablee)Toast.makeText(getActivity(),"Somethingwentwrong!",Toast.LENGTH_SHORT).show();}publicvoidonNext(List<AppInfo>}}定義一個函數(shù)使我們能夠用同樣一個block來處理兩種場景成為了可能。當(dāng)fragment加載時我們只需調(diào)用heList()方法并設(shè)置refreshTheList方法作為用戶下拉這一行為所觸發(fā)我們第一個例子現(xiàn)在完成了從列表創(chuàng)建一個在這個例子中,引入from()函數(shù)。使用這個特殊的“創(chuàng)建”函數(shù),我們可以從一個列表中創(chuàng)建一個Observ為了實現(xiàn)和第一個例子同樣的結(jié)果,我們在每一個onNext()函數(shù)更新我們的適配器,添加mAppsmApps=privateprivatevoidloadList(List<AppInfo>.subscribe(newObserver<AppInfo>()public{Toast.makeText(getActivity(),"Hereisthelist!",}publicvoidonError(Throwablee)Toast.makeText(getActivity(),"Somethingwentwrong!",Toast.LENGTH_SHORT).show();}publicvoidonNext(AppInfo{mAddedApps.add(appInfo);mAdapter.addApplication(mAddedApps.size()-1,appInfo);}}正如你看到的,已安裝的應(yīng)用程序列表作為參數(shù)傳進from()函數(shù),然后我們訂閱生成的Observable。觀察 pleted()函數(shù)中停掉進度條是因為們一個一個的發(fā)射元素;第一個例子中的Observable發(fā)射的是整個list,因此在onNext()函數(shù)中停掉進度條的做,再多幾個,

,和timerListList<AppInfo>apps=ApplicationsList.getInstance().getList();AppInfoappOne=apps.get(0);AppInfoappTwo=AppInfoappThree=apps.get(24);我們可以像我們之前的例子那樣檢索列表并提取出這三個元素。然后他們傳到這個loadApps()函數(shù)里面privateprivatevoidloadApps(AppInfoappOne,AppInfoappTwo,AppInfo.subscribe(newObserver<AppInfo>()public{Toast.makeText(getActivity(),"Hereisthelist!",}publicvoidonError(Throwablee)Toast.makeText(getActivity(),"Somethingwentwrong!",Toast.LENGTH_SHORT).show();}publicvoidonNext(AppInfo{mAddedApps.add(appInfo);mAdapter.addApplication(mAddedApps.size()-1,appInfo);}}你可以將一個函數(shù)作為參數(shù)傳給just方法,你將會得到一個已存在代碼的原始Observable版本。在一個新的響假如你想對一個Observable重復(fù)發(fā)射三次數(shù)據(jù)。例如,我們用just()例子中的privateprivatevoidloadApps(AppInfoappOne,AppInfoappTwo,AppInfo.subscribe(newObserver<AppInfo>()public{Toast.makeText(getActivity(),"Hereisthelist!",}publicvoidonError(Throwablee)Toast.makeText(getActivity(),"Somethingwentwrong!",Toast.LENGTH_SHORT).show();}publicvoidonNext(AppInfo{mAddedApps.add(appInfo);mAdapter.addApplication(mAddedApps.size()-1,appInfo);}}正如你看到的,我們在just()創(chuàng)建Observable后追加了repeat(3),它將會創(chuàng)建9個元素的序列,每一個都單獨有這樣一個場景,你想在這一個Observable但是你又想推遲這個Observable的創(chuàng)建直到觀察者訂閱時??聪旅娴膅etInt()函數(shù):privateprivateObservable<Integer>getInt(){returnObservable.create(subscriber-}}這比較簡單,并且它沒有做太多事情,但是它正好為我們服務(wù)?,F(xiàn)在,我們可以創(chuàng)建一個新的Observable并且用defer()ObservableObservable<Integer>deferred=這次,deferred存在,但是getInt()create()方法還沒有調(diào)用:logcat日志也沒有“GETINT”打印出來deferred.subscribe(numberdeferred.subscribe(number-{但是一旦我們訂閱了,create()方法就會被調(diào)用并且我們也可以在logcat日志中得到下賣弄兩個:GETINT和42你需要從一個指定的數(shù)字X開始發(fā)射N個數(shù)字嗎?你可以用range.subscribe(newObserver<Integer>()publicpleted()Toast.makeText(getActivity(),"Yeaaah!",}publicvoidonError(Throwablee)Toast.makeText(getActivity(),"Somethingwentwrong!",}publicvoidonNext(Integernumber)Toast.makeText(getActivity(),"Isay"+number,}range()函數(shù)用兩個數(shù)字作為參數(shù):第一個是起始點,第二個是我們想發(fā)射數(shù)字的個interval()函數(shù)在你需要創(chuàng)建一個輪詢程序時非常SubscriptionSubscriptionstopMePlease=.subscribe(newObserver<Integer>()publicpleted()Toast.makeText(getActivity(),"Yeaaah!",}publicvoidonError(Throwablee)Toast.makeText(getActivity(),"Somethingwentwrong!",}publicpublicvoidonNext(Integernumber)Toast.makeText(getActivity(),"Isay"+number,}interval()函數(shù)的兩個參數(shù):一個指定兩次發(fā)射的時間間隔,另一個是用到的時間單如果你需要一個一段時間之后才發(fā)射的Observable,你可以像下面的例子使用timer().subscribe(newObserver<Long>()publicpleted()}publicvoidonError(Throwablee)}publicvoidonNext(Long{Log.d("RXJAVA","Isay"+}它將3秒后發(fā)射0,然后就完成了。讓我們使用timer()的第三個參數(shù),就像下面的例.subscribe(newObserver<Long>()publicpleted()}publicvoidonError(Throwablee)}publicvoidonNext(Long{Log.d("RXJAVA","Isay"+}用這個代碼,你可以創(chuàng)建一個以初始值來延遲(上一個例子是3秒)執(zhí)行的interval版本,然后每隔N秒就發(fā)射總在下一章中,掌握過濾操作,能夠從我們接收到的序列中創(chuàng)建我們需要的序列5過濾這一章中,研究可觀列的本質(zhì):過濾。學(xué)到如何從發(fā)射的Observable中選取我們想要的值,如 過濾RxJava讓我們使用filter()方法來過濾我們觀列中不想要的值,在上一章中,我們在幾個例子中使用了已裝的應(yīng)用列表,但是我們只想展示以字母C開頭的已安裝的應(yīng)用該怎么辦呢?在這個新的例子中,使用同樣的列表,但是我們會過濾它,通過把合適的謂詞傳給filter()函數(shù)來得到我們想要的值。上一章中l(wèi)oadList()函數(shù)可以改成這樣privateprivatevoidloadList(List<AppInfo>.filter((appInfo)->.subscribe(newObserver<AppInfo>()public{}publicvoidonError(Throwablee)Toast.makeText(getActivity(),"Somethingwentwrong!",Toast.LENGTH_SHORT).show();}publicvoidonNext(AppInfo{mAddedApps.add(appInfo);mAdapter.addApplication(mAddedApps.size()-1,appInfo);}}我們從上一章中的loadList()函數(shù)中添加下面.fliter((appInfo.fliter((appInfo->Func1<AppInfo,Boolean>(){@OverridepublicBooleancall(AppInfoappInfo){return}我們傳一個新的Func1對象給filter函數(shù),即只有一個參數(shù)的函數(shù)。Func1有一個AppInfo對象來作為它參數(shù)類型并且返回Boolean對象。只要條件符合filter()函數(shù)就會返回true。此時,值會發(fā)射出去并且所有的正如你想的那樣,從一個我得到的可觀中創(chuàng)建個我們需要的序列fiter)很的我不要道可觀列的源或者為什發(fā)射這么多不同數(shù)據(jù)。們只是想要這些元素的子集創(chuàng)建一個可以在用中使filter函數(shù)最常用的用法之一時過濾nullFunc1<AppInfo,Boolean>(){@OverridepublicBooleancall(AppInfoappInfo){returnappInfo!=}這看起來簡單,對于簡單的事情有許多模板代碼,但是它幫我們免去了在onNext()函數(shù)調(diào)用中再去檢測獲取我們需要的當(dāng)我們不需要整個序列時,而是只想取開頭或結(jié)尾的幾個元素,我們可以用take或takeLast如果我們只想要一個可觀列中的前三個元素那將會怎么樣,發(fā)射它們,然后讓Observable完成嗎?take()函privateprivatevoidloadList(List<AppInfo>.subscribe(newObserver<AppInfo>()public{}publicvoidonError(Throwablee)Toast.makeText(getActivity(),"Somethingwentwrong!",Toast.LENGTH_SHORT).show();}publicvoidonNext(AppInfo{mAddedApps.add(appInfo);mAdapter.addApplication(mAddedApps.size()-1,appInfo);}}下圖中展示了發(fā)射數(shù)字的一個可觀列。我們對這個可觀列應(yīng)用take(2)函數(shù),然后我們創(chuàng)建一個只發(fā)射如果我們想要最后N個元素,我們只需使用takeLast函數(shù)下圖中展示了我們在已安裝的應(yīng)用列表使用take()和takeLast函數(shù)后發(fā)生的結(jié)果有且僅有一個可觀列會在出錯時重復(fù)發(fā)射或者被設(shè)計成重復(fù)發(fā)射。distinct()和distinctUntilChanged()函數(shù)可以方如果我們想對一個指定的值僅處理一次該怎么辦?我們可以對我們的序列使用distinct()函數(shù)takeLast()一樣,distinct()作用于一個完整的序列,然后得到重復(fù)的過濾項,它需要記錄每一個發(fā)射的為了創(chuàng)建我們例子中序列,使用我們至今已經(jīng)學(xué)到的幾個方法:*take():它有一小組的可識別的數(shù)據(jù)項。*repeat():創(chuàng)建一個有重復(fù)的大的序列。然后,應(yīng)用distinct()函數(shù)來去除重復(fù)ObservableObservable<AppInfo>fullOfDuplicates=fullOfDuplicates變量里把我們已安裝應(yīng)用的前三個重復(fù)了3次:有9個并且許多重復(fù)的。然后,我們使用ct().subscribe(newObserver<AppInfo>()public{}publicvoidonError(Throwablee)Toast.makeText(getActivity(),"Somethingwentwrong!",Toast.LENGTH_SHORT).show();}publicvoidonNext(AppInfo{mAddedApps.add(appInfo);mAdapter.addApplication(mAddedApps.size()-1,appInfo);}}結(jié)果,很明顯,我們得到itictUtilhaned()下圖用圖形化的方式展示了我們?nèi)绾螌istinctUntilChanged()函數(shù)應(yīng)用在一個存在的序列上來創(chuàng)建一個新的不Firstandfirst()方法和last()方法很容易弄明白。它們從Observable中只發(fā)射第一個元素或者最后一個元素。這兩個都可以傳Func1作為參數(shù),:一個可以確定我們感的第一個或者最后一個的謂詞:下圖展示了last()應(yīng)用在一個完成的序列上來創(chuàng)建一個僅僅發(fā)射最后一個元素的新的Observable與first()和last()相似的變量有:firstOrDefault()和lastOrDefault().這兩個函數(shù)當(dāng)可觀列完成時不SkipandSki下圖中展示了如何使用skip(2)來創(chuàng)建一個不發(fā)射前兩個元素而是發(fā)射它后面的那些ski()si st)函數(shù)tke()和takLas()應(yīng)。它們用整數(shù)N作參數(shù),本質(zhì)上來說,它們讓rvable發(fā)射前N個或者后N個。如果我們知道個序列沒有太多用的“可控”元素頭或結(jié)尾時我們以使用它。如果我們只想要可觀列發(fā)射的第五個元素該怎么辦?elementAt()函數(shù)僅從一個序列中發(fā)射第n個元素然后就如果我們想查找第五個元素但是可觀列只有三個元素可供發(fā)射時該怎么辦?我們可以使用elementAtOrDefault()。下圖展示了如何通過使用elementAt(2)從一個序列中選擇第三個元素以及如何創(chuàng)建一個只發(fā)射指定元素的。在Observable面加一個sampe(),創(chuàng)一個的可,它在個指定的時間間隔里由ObserableObservableObservable<Integer>sensor=.subscribe(newObserver<Integer>()publicpleted()}publicvoidonError(Throwablee)}publicvoidonNext(Integer{ }例子中Observable將會觀測溫度Observable然后每隔30秒就會發(fā)射最后一個溫度值。很明顯,sample()支持全部如果我們想讓它定時發(fā)射第一個元素而不是最近的一個元素,我們可以使用throttleFirst()tieou()函數(shù)可觀列就是在們設(shè)的時間隔如果沒得到個值tmeot()為一個ObservabObservble不發(fā)射值的話,它的原始的Observable時就會觸發(fā)onError()函數(shù)SubscriptionSubscriptionsubscription=.subscribe(newObserver<Integer>()publicpleted()}publicvoidonError(Throwablee)Log.d("RXJAVA","Youshouldgocheckthesensor,}publicvoidonNext(Integer{ }和sample一樣,timeout()使用TimeUnit對象來指定時間間隔下圖中展示了一旦Observable超過了限時就會觸發(fā)onError函數(shù):因為超時后它才到達,所以最后一個元素將debounce函數(shù)過濾掉由Observable發(fā)射的速率過快的數(shù)據(jù);如果在一個指定的時間間隔過去了仍舊沒有發(fā)射一就像sample()和timeout()函數(shù)一樣,debounce使用TimeUnit對象指定時間間隔下圖展示了多久從Observable發(fā)射一次新的數(shù)據(jù),debounce()函數(shù)開啟一個內(nèi)部定時器,如果在這個時間間隔內(nèi)總這一章中,我們學(xué)習(xí)了如何過濾一個可觀列。我們現(xiàn)在可以使用filter(),skip(),和sample()來創(chuàng)建我下一章中,學(xué)習(xí)如何轉(zhuǎn)換一個序列,將函數(shù)應(yīng)用到每個元素,給它們分組和掃描來創(chuàng)建我們所需要的能完6轉(zhuǎn)換在上一章中,我們探索了RxJava通用過濾方法。我們學(xué)習(xí)了如何使用filter()方法過濾我們不需要的值,如何用take得到發(fā)射元素的子集,如何使用distinct()函數(shù)來去除重復(fù)的。我們學(xué)習(xí)了如何借助timeout,mple(),以及debounce來利這一章中 RxJava提供了幾個 以及 RxJava的map函數(shù)接收一個指定的Func對象然后將它應(yīng)用到每一個由Observable發(fā)射的值上。下圖展示了如何我們的loadList()函數(shù)可以改成這樣privateprivatevoidloadList(List<AppInfo>Func1<AppInfo,AppInfo>(){@OverrpublicAppinfocall(AppInfoappInfo){StringcurrentName=StringlowerCaseName=currentName.toLowerCase();return}.subscribe(newObserver<AppInfo>()}}publicvoidonError(Throwablee)Toast.makeText(getActivity(),"Somethingwentwrong!",Toast.LENGTH_SHORT).show();}publicvoidonNext(AppInfo{mAddedApps.add(appInfo);mAdapter.addApplication(mAddedApps.size()-1,appInfo);}}正如你看到的,像往常一樣創(chuàng)建我們發(fā)射的Observable之后,我們追加一個map調(diào)用,我們創(chuàng)建一來更新AppInfo對象并提供一個名字小寫的新版本給觀察者xJava的flatMap()函數(shù)提供一種鋪平序列的方式,然后合并這些Observables發(fā)射的數(shù)據(jù),最后將合并后的結(jié)果當(dāng)我們在處理可能有大量的Observables時,重要是記住任何一個Observables發(fā)生錯誤的情況,flatMap將觸發(fā)它自己的onError()函數(shù)并放棄整個鏈重要的一點提示是關(guān)于合并部分:它允許交叉。正如上圖所示,這意味著flatMap不能夠保證在最終生成的ObsRxJava的concatMap()函數(shù)解決了flatMap的交叉問題,提供了一種能夠把發(fā)射的值連續(xù)在一起的鋪平函 作為*map的一員,flatMapIn ble()和flatMap()很像。僅有的本質(zhì)不同是它將源數(shù)據(jù)兩兩結(jié)成對并生成I 和flatMap()很像,除了一點:每當(dāng)源Observable發(fā)射一個新的數(shù)據(jù)項(ObservablRxJava的scan函數(shù)可以看做是一個累積函數(shù)。scan()函數(shù)對原始Observable發(fā)射的每一項數(shù)據(jù)都應(yīng)用一個函.scan((sum,item)->sum+.subscribe(new{publicvoid pleted(){Log.d("RXJAVA","Sequencecompleted.");}publicvoidonError(Throwable{Log.e("RXJAVA","Somethingwent}publicvoidonNext(Integer{Log.d("RXJAVA","itemis:"+}我們得到的結(jié)果RXJAVARXJAVA:itemis:1RXJAVA:itemis:3RXJAVA:itemis:6RXJAVA:itemis:10RXJAVA:itemis:RXJAVA:Sequence我們也可以創(chuàng)建一個新版本的loadList()函數(shù)用來比較每個安裝應(yīng)用的名字從而創(chuàng)建一個名字長度privateprivatevoidloadList(List<AppInfo>.scan((appInfo,appInfo2)->{if(appInfo.getName().length>appInfo2.getName().length()){return}elsereturn}.subscribe(newObserver<AppInfo>()public{}publicvoidpublicvoidonError(Throwablee)Toast.makeText(getActivity(),"Somethingwentwrong!",Toast.LENGTH_SHORT).show();}publicvoidonNext(AppInfo{mAddedApps.add(appInfo);mAdapter.addApplication(mAddedApps.size()-1,appInfo);}}結(jié)果如下有一個scan()函數(shù)的變體,它用初始值作為第一個發(fā)射的值,方法簽名看起來像:scan(R,Func2),如下圖中的拿第一個例子開始,我們安裝的應(yīng)用程序列表按照字母表的順序排序。然而,如果現(xiàn)在我們想按照最近更新來排序我們的App時該怎么辦?RxJava提供了一個有用的函數(shù)從列表中按照指定的規(guī)則:groupBy()來分組素。下圖中的例子展示了groupBy()如何將發(fā)射的值根據(jù)他們的形狀來進這個函數(shù)將源ObservableObservblesObservableObservabl一組指定的數(shù)據(jù)。為了創(chuàng)建一個分組了的已安裝應(yīng)用列表,我們在loadList()函數(shù)中引入了一個新ObservableObservable<GroupedObservable<String,AppInfo>>groupedItems=Func1<AppInfo,String>(){@OverridepublicStringcall(AppInfoappInfo){SimpleDateFormatformatter=newSimpleDateFormat("MM/yyyy");returnformatter.format(newDate(appInfo.getLastUpdateTime()));}現(xiàn)在我們創(chuàng)建了一個新的Observable,groupedItems,它將會發(fā)射一個帶有GroupedObservable的序列。dObservable是一個特殊的Observable,它源自一個分組的key。在這個例子中,key就是String,代表的意思Month/Year格式化的這一點,我們已經(jīng)創(chuàng)建了幾個發(fā)射AppInfo數(shù)據(jù)的Observable,用來填充我們的列表。我們想保留字母排序和分.subscribe(newObserver<AppInfo>()public{}publicvoidonError(Throwablee)Toast.makeText(getActivity(),"Somethingwentwrong!",Toast.LENGTH_SHORT).show();}publicvoidonNext(AppInfo{mAddedApps.add(appInfo);mAdapter.addApplication(mAddedApps.size()-1,appInfo);}我們的loadList函數(shù)完成了,結(jié)RxJava中的buffer()函數(shù)將源Observable變換一個新的Observable,這個新的Observable每次發(fā)射一組列表值而上圖中展示了buffer如何將count作為一個參數(shù)來指定有多少數(shù)據(jù)項被包在發(fā)射的列表中。實際上,r()函數(shù)有幾種變體。其中有一個是允許你指定一個skip值:此后每skip項數(shù)據(jù),然后又用count項數(shù)據(jù)填充緩buffer()帶一個timespan的參數(shù),會創(chuàng)建一個每隔timespan時間段就會發(fā)射一個列表的ObservableRxJava的window()函數(shù)和buffer()很像,但是它發(fā)射的是Observable而不是列表。下圖展示了window如何緩這些Observables中的每一個都發(fā)射原始Observable數(shù)據(jù)的一個子集,數(shù)量由count指定最后發(fā)射一 ed()結(jié)束。正如buffer()一樣,window()也有一個skip變體,如下圖所RxJava的cast函數(shù)是本章中最后一個操作符。它是map操作符的特殊版本。它將源Observable中的每一項據(jù)都轉(zhuǎn)換為新的類型,把它變成了不同的Class總下一章,學(xué)習(xí)如何組合Observable,合并它們,連接它們,再或者打包它們7組合 ,groupBY(),以及有用的函數(shù)的實本章中 在”異步的世界“中經(jīng)常會創(chuàng)建這樣的場景,我們有多個來源但是又只想有一個結(jié)果:多輸入,單輸出。的merge()方法將幫助你把兩個甚至的Observables合并到他們發(fā)射的數(shù)據(jù)項里。下圖給出了把兩個序列合并ObservbleObservable連接在一起并且不會交叉。ervable。我們可以創(chuàng)建一個單獨的應(yīng)用列表然后讓它逆序排列。當(dāng)然這沒有實際的意義,只是為了這個例子。于第二個列表,我們的loadList()函數(shù)像下面這privatevoidloadList(List<AppInfo>ListreversedApps=Lists.reverse(apps);Observable<AppInfo>observableApps=Observable.from(apps);Observable<AppInfo>observableReversedApps=Observable.from(reversedApps);Observable<AppInfo>mergedObserbable=Observer<AppInfo>(){@Overridepublicvoid {Toast.makeText(getActivity(),"Hereisthelist!",}publicvoidonError(Throwablee)Toast.makeText(getActivity(),"OneofthetwoObservablethrewanerror!",}publicvoid{mAddedApps.add(appInfo);mAdapter.addApplication(mAddedApps.size()-1,appInfo);}}我們創(chuàng)建了Observable和observableApps數(shù)據(jù)項以及新的observableReversedApps逆序列表。使用Observable.merge(),我們可以創(chuàng)建新的ObservableMergedObservable,它在單個可觀列中發(fā)射源Observables發(fā)出的所有注意錯誤時的toast消息,你可以認為每個Observable拋出的錯誤都將會打斷合并。如果你需要避免這種Java提供了mergeDelayError(),它能從一個Observable中繼續(xù)發(fā)射數(shù)據(jù)即便是其中有一個拋出了錯誤。當(dāng)所有Observables都完成時,mergeDelayError()將會發(fā)射onError(),如下圖所示在一種新的可能場景中處理多個數(shù)據(jù)來源時會帶來:多從個Observables接收數(shù)據(jù),處理它們,然后將它們合并一個新的可觀列來使用。RxJava有一個特殊的方法可以完成:zip()合并兩個或者多個Observables發(fā)射出數(shù)據(jù)項,根據(jù)指定的函數(shù)Func*變換它們,并發(fā)射一個新值。下圖展示了zip()方法如何處理發(fā)射的“numbers”對于“真實世界”的例子來說,使用已安裝的應(yīng)用列表和一個新的動態(tài)的Observable來讓例子變得有點有ObservableObservable<Long>tictoc=Oerval(1,tictocObservable變量使用interval()函數(shù)每秒生成一個Long類型的數(shù)據(jù):雖簡單但有效,正如之前所說的,我們需要一個Func對象。因為它需要傳兩個參數(shù),所以是Func2:privateprivateAppInfoupdateTitle(AppInfoappInfo,Long{appInfo.setName(time+""+appInfo.getName());returnappInfo;}現(xiàn)在我們的loadList函數(shù)變成這樣privateprivatevoidloadList(List<AppInfo>{mRecyclerView.setVisibility(View.VISIBLE);Observable<AppInfo>observableApp=Observable.from(apps);Observable<Long>tictoc=Oerval(1,TimeUnit.SECONDS);Observable.zip(observableApp,tictoc,(AppInfoappInfo,Longtime)->updateTitle(appInfo,.subscribe(new{public pleted()Toast.makeText(getActivity(),"Hereisthelist!",}publicvoidonError(Throwable{Toast.makeText(getActivity(),"Somethingwentwrong!",}publicvoidonNext(AppInfoappInfo)if{}intposition=mAddedApps.size()-1;mAdapter.addApplication(position,appInfo);}}正如你看到的那樣,zip函數(shù)有三個參數(shù):兩個Observables和一個Func2仔細一看會發(fā)現(xiàn)observeOn()函數(shù)。它將在下一章中講解:現(xiàn)在我們可以小試一下。前面兩個方法,zip和merge()方法作用在發(fā)射數(shù)據(jù)的范疇內(nèi),在決定如何操作值之前有些場景我們需要考時間的。RxJava的join()函數(shù)基于時間窗口將兩個Observables發(fā)射的數(shù)據(jù)結(jié)合為了正確的理解上一,我們解釋下join()需要的參數(shù)Func1參數(shù):在指定的由時間窗口定義時間間隔內(nèi),源Observable發(fā)射的數(shù)據(jù)和從第二個Observable發(fā)射的Func1參數(shù):在指定的由時間窗口定義時間間隔內(nèi),第二個Observable發(fā)射的數(shù)據(jù)和從源Observable發(fā)射的Func2參數(shù):定義已發(fā)射的數(shù)據(jù)如何與新發(fā)射的數(shù)據(jù)項相結(jié)如下練習(xí)的例子,我們可以修改loadList()函數(shù)像下面這樣privateprivatevoidloadList(List<AppInfo>{Observable<AppInfo>appsSequence=Oerval(1000,TimeUnit.MILLISECONDS).map(position->returnObservable<Long>tictoc=Oerval(1000,TimeUnit.MILLISECONDS);appInfo->Observable.timer(2,TimeUnit.SECONDS),time->Observable.timer(0,TimeUnit.SECONDS),.subscribe(new{public pleted()Toast.makeText(getActivity(),"Hereisthelist!",}publicvoidonError(Throwable{Toast.makeText(getActivity(),"Somethingwentwrong!",}publicvoidonNext(AppInfoappInfo)if{}intposition=mAddedApps.size()-1;mAdapter.addApplication(position,appInfo);}}我們有一個新的對象appsSequence,它是一個每秒從我們已安裝的app列表發(fā)射app數(shù)據(jù)的可觀列。這個Observable數(shù)據(jù)每秒只發(fā)射一個新的Long型整數(shù)。為了合并它們,我們需要指定兩個Func1變量appInfoappInfo->Observable.timer(2,time->Observable.timer(0,上面描述了兩個時間窗口。下面一行描述我們?nèi)绾问褂肍unc2將兩個發(fā)射的數(shù)據(jù)結(jié)合結(jié)果如下值得一提的是,為了簡單起見,也有一個join()操作符作用于字符串然后簡單的和發(fā)射的字符串連接成最終的字 bineLatest()函數(shù)有點像zip()函數(shù)的特殊形式。正如我們已經(jīng)學(xué)習(xí)的,zip()作用于最近未打的兩個Observables。相反,combineLatest()作用于最近發(fā)射的數(shù)據(jù)項:如果Observable1發(fā)射了A并且ble2發(fā)射了B和C,combineLatest將會分組處理AB和AC,如下圖所示combineLatest()函數(shù)接受二到九個Observable作為參數(shù),如果有需要的話或者單個Observables列表作為參數(shù)從之前的例子中把loadList函數(shù)借用過來,我們可以修改一下來用于combineLatest()實現(xiàn)“真實世界”這個privateprivatevoidloadList(List<AppInfo>{Observable<AppInfo>appsSequence=Oerval(1000,.map(position-Observable<Long>tictoc=Oerval(1500,TimeUnit.MILLISECONDS);bineLatest(appsSequence,tictoc,.subscribe(newObserver<AppInfo>()publicpleted()Toast.makeText(getActivity(),"Hereisthelist!",}publicvoidonError(Throwable{Toast.makeText(getActivity(),"Somethingwentwrong!",}publicvoidonNext(AppInfoappInfo)if{}intposition=mAddedApps.size()-1;mAdapter.addApplication(position,appInfo);}}射一個Long型整數(shù)。 他們結(jié)合起來并執(zhí)行updateTitle()函數(shù),結(jié)果如下:正如你看到的,由于不同的時間間隔,AppInfo對象如我們所預(yù)料的那樣有時候會重And,Then和在將來還有一些zip()滿足不了的場景。如復(fù)雜的架構(gòu),或者是僅僅為了個人,你可以使用And/Then/When解我們的loadList函數(shù)將會被修改從privatepr

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論