TODO-MVP-RXJAVA 源碼體驗

你們好,我是蒼王。
html

如下是我這個系列的相關文章,有興趣能夠參考一下,能夠給個喜歡或者關注個人文章。java

[Android]如何作一個崩潰率少於千分之三噶應用app--章節列表android


相信有關注個人人,都會看過我第一編介紹的Todo-mvp源碼體驗,這是基礎編。
sql

這一節給你們分享的RXJAVA和MVP設計之間的架構。數據庫

固然看這篇文章前,但願你有必定的Rxjava的基礎知識。編程


一.Lambda

這裏須要介紹一下Java8的新特性,你能夠叫這東西爲閉包,起是屬於一種函數式編程
緩存

官方配置

buildToolVersion須要使用24以上,由於Android N之後的build Tool才支持閉包


配置打開jackOptions架構

使用新的 Java 8 語言功能,還需使用新的 Jack 工具鏈。新的 Android 工具鏈將 Java 源語言編譯成 Android 可讀取的 Dalvik 可執行文件字節碼,且有其本身的 .jack 庫格式,在一個工具中提供了大多數工具鏈功能:從新打包、壓縮、模糊化以及 Dalvik 可執行文件分包。
app


java版本數須要引用java1.8


Instant Run目前不能用於 Jack,在使用新的工具鏈時將被停用。

能夠看這裏的介紹:使用 Java 8 語言功能

****2017.3.27*****

剛發佈,就聽到羣內的同窗說jack要被google廢棄了,詳情請見Future of Java8



兼容性第三方配置

buildTool在24以前那麼只能使用兼容包了

在項目的build gradle須要配置retrolambda的引用


也有推薦這樣的配置


而後每一個module的build.gradle還須要配置


Lambda原理

或者你感受和內部匿名類的縮進後差很少(如Runnable),其原理並不是如此。

其實際是使用了invokeDynamic指令,運行時調用LambdaMetafactory.metafactory動態的生成內部類,實現了接口,內部類裏的調用方法塊並非動態生成的,只是在原class裏已經編譯生成了一個靜態的方法,內部類只須要調用該靜態方法

這裏不作深刻的解析,具體能夠參考Java 8 動態類型語言Lambda表達式實現原理分析

Lambda還能配合Streams作更多一些操做,具體能夠查看Java Lambda表達式入門

若是你以爲Lambda的函數式編程很爽,就一直使用,可是Lambda有時候的性能並不必定比Java原來的代碼快,具體性能對比能夠看:java8特性lambda基本原理及性能分析


二.源碼分析

1.相關引用

這裏引用了rxjava和rxandroid兩個RX的庫,

rxandroid用於線程切換

還有sqlbrite的庫是響應式數據查詢框架


2.線程調度

咱們看一下TaskPresenter的建立,須要傳入taskRepository,View對象,還有SchedulerProvider對象(RxAndroid線程切換)


這裏面數據源也會使用


其封裝了三個RxAndroid的線程接口

Schedulers.computation( )用於計算任務,如事件循環或和回調處理

Schedulers.io( )用於IO密集型任務,如異步阻塞IO操做,這個調度器的線程池會根據須要增加

AndroidSchedulers.mainThread() 運行在Android UI線程上


這裏面CompositeSubscription是Subject的集合,能夠用於統一釋放。


這裏mTasksView.setPresenter會將TasksFragment鏈接起來。

經過TasksFragment的onResume和onPause生命週期作一些綁定操做


TaskPresteners的綁定方法,使用的是加載數據loadTasks


3.數據加載

loadTasks裏面會有不少RxJava的操做符,這裏慢慢解析


Subscription Observable.subscribe綁定的時候會返回一個Subscription的對象


getTasks方法中獲取遠程數據和本地數據

concat的操做符是用於依次將多個數據源釋放到同一個地方。

filter過濾掉空的任務

first是返回第一條符合要求的數據

起最終返回的是Observable<List<Task>>的數據


flatMap將List<Task> tasks對象轉化爲Observable<Task>

from會依次返回List中的每一個item

filter裏面過濾掉是否進行中的任務(這個是記事本原本的邏輯)

toList將其組裝成List的對象


subscribeOn和observeOn都是用來切換線程用的

subscribeOn的調用,改變了調用前序列所運行的線程。subscribeOn改變的是subscribe這句調用所在的線程

observeOn對以前的序列產生的結果先緩存起來,而後再在指定的線程上,推送給最終的subscriber

請注意這三點!!!

subscribeOn的調用切換以前的線程。

observeOn的調用切換以後的線程。

observeOn以後,不可再調用subscribeOn切換線程

數據正常發送完畢doOnCompleted會被觸發


咱們看看Subscribe,感受咱們平時見到的Subscribe有必定的區別,利用了lamba縮進


其真實效果是會這樣的


這裏須要添加subscription到CompositeSubscription統一管理


TaskFragment裏面onPause當中調用unsubscribe()


而後使用CompositeSubscription清除全部的Subscription


4.數據源變化

咱們看看起本地數據源使用sqlBrite的變化

一開始建立出BriteDataBase mDataBasehelper


獲取本地數據


返回查詢數據

createQuery返回的是QueryObservable的數據類型,很明顯sqlBrite是兼容Observable的轉換


能夠看到mapToList會將其轉換爲Observable的數據



5.縮進進入

點擊左邊,那個紅色的標誌,能夠直接進入到調用到縮進的方法


這個是直接調用processTasks()的方法



三.總結

1.Rxjava的標識符運用

2.Lambda函數式編程,縮進運用和理解

3.SqlBrite數據庫的運用,只是配置RxJava轉換爲Observable對象的操做



這節就到這裏,

下一節將會更精彩!!!敬請期待。

羣號是316556016,也能夠掃碼進羣。我在這裏期待大家的加入!!!

相關文章
相關標籤/搜索