Rxjava有三個原因:
第一個是代碼的簡潔度爸黄,鏈式欣舵。
第二個是響應式框架擎鸠,觀察者模式。
第三個就是它是一個異步的框架缘圈,線程切換功能極其強大劣光,可任意指定觀察者發(fā)生的線程以及被觀察者的線程袜蚕,隨意調(diào)整極其強大(觀察者發(fā)生的線程只能更改一次,被觀察的可以隨意切換
Observable和Subscriber大家已經(jīng)很熟悉了绢涡,分別是被觀察者和觀察者
在使用RxJava過程中我們一般都是三步
第一步創(chuàng)建Observable牲剃,第二部創(chuàng)建Subscriber,第三步通過subscribe()方法達到訂閱的目的
subscribeOn()只能定義一次垂寥,而observerOn()方法可以定義多次颠黎,也就是可以通過observerOn方法實現(xiàn)線程位置的多重轉(zhuǎn)換
通過subscribeOn(Schedulers.io()),
observeOn(AndroidSchedulers.mainThread())輕松的實現(xiàn)線程的切換
schedule.newThread():直接開啟一個新的線程滞项。
Observable.just(1, 2, 3, 4) // IO 線程狭归,由 subscribeOn() 指定
? ? .subscribeOn(Schedulers.io())
? ? .observeOn(Schedulers.newThread())
? ? .map(mapOperator) // 新線程,由 observeOn() 指定
? ? .observeOn(Schedulers.io())
? ? .map(mapOperator2) // IO 線程文判,由 observeOn() 指定
? ? .observeOn(AndroidSchedulers.mainThread)
? ? .subscribe(subscriber);? // Android 主線程过椎,由 observeOn() 指定
schedule.io():顧名思義,開啟一個io線程戏仓,完成對網(wǎng)絡請求和文件讀寫數(shù)據(jù)庫增刪改查等操作疚宇。可能這時候有人就要問了赏殃,那io和newThread有什么區(qū)別吶敷待?其實區(qū)別在于,newThread不管有沒有線程仁热,他都會去重新開啟一個新的線程來進行操作榜揖,并且沒線程池維護。但是io的線程是無上限的抗蠢,并且最大的一個好處是它會去重用空閑的線程举哟,而不是每次都開啟一個線程來使用,效率上比newThread要高迅矛。所以妨猩,一般我們在使用的時候是直接使用io這個方法。
android有一個專門的線程秽褒,AndroidSchedule.mainThread()壶硅,專門用來指定操作在主線程完成。
subscribeOn是影響生產(chǎn)者(Observable)生產(chǎn)數(shù)據(jù)的線程的震嫉,通常我們只需要指定生產(chǎn)者在某一個特定的線程生產(chǎn)數(shù)據(jù)就可以滿足我們的需求森瘪,至少我還沒遇到過需要在生產(chǎn)數(shù)據(jù)的過程中去切換生產(chǎn)者所在的線程的情況。絕大多數(shù)我們需要變化線程的場景都是在數(shù)據(jù)生產(chǎn)之后票堵,Rx里面就使用observeOn來指定各種operator和subcriber的線程,因為這些本質(zhì)上都是數(shù)據(jù)的消費者逮栅。消費者可以任意切換自己接受處理數(shù)據(jù)的線程悴势,足以滿足我們的需求
結論
多線程通信窗宇,只能是線性來實現(xiàn)
Hanlder 是基于生產(chǎn)消費模式來進行現(xiàn)實的
observeOn修改的是他 下面 的代碼執(zhí)行的線程 向下的訂閱
subscribeOn修改的是他 上面 執(zhí)行代碼的線程? 向上的訂閱
Rxandroid 子線程執(zhí)行后,在subscribe()時特纤,會一步一步去執(zhí)行observable.onSubscribe.call(),對于SubscribeOn來說他的call()方法的真正實現(xiàn)就是在這里军俊。那么還要注意一點的是這個call()的回調(diào)時機,這里要和ObserveOn()做比較捧存,稍后再分析粪躬。回到這里的call方法昔穴,首先通過外部傳入的scheduler創(chuàng)建Worker - inner對象镰官,接著在inner中執(zhí)行了一段代碼,Action0中call()方法這段代碼就在worker線程中執(zhí)行了吗货,也就是此刻線程進行了切換泳唠。
注意最后一句代碼source.unsafeSubscribe(s)就是將當前的Observable與上一個Observable通過onSubscribe關聯(lián)起來。那么如果上一個Observable也是一個subscribeOn()產(chǎn)生的那么會出現(xiàn)什么情況宙搬?很顯然最終會切換到上一個subscribeOn指定的線程中
https://blog.csdn.net/chenkai19920410/article/details/52515771