你們好,我是蒼王。
html
如下是我這個系列的相關文章,有興趣能夠參考一下,能夠給個喜歡或者關注個人文章。java
[Android]如何作一個崩潰率少於千分之三噶應用app--章節列表android
相信有關注個人人,都會看過我第一編介紹的Todo-mvp源碼體驗,這是基礎編。
sql
這一節給你們分享的RXJAVA和MVP設計之間的架構。數據庫
固然看這篇文章前,但願你有必定的Rxjava的基礎知識。編程
這裏須要介紹一下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還須要配置
或者你感受和內部匿名類的縮進後差很少(如Runnable),其原理並不是如此。
其實際是使用了invokeDynamic指令,運行時調用LambdaMetafactory.metafactory動態的生成內部類,實現了接口,內部類裏的調用方法塊並非動態生成的,只是在原class裏已經編譯生成了一個靜態的方法,內部類只須要調用該靜態方法
這裏不作深刻的解析,具體能夠參考Java 8 動態類型語言Lambda表達式實現原理分析
Lambda還能配合Streams作更多一些操做,具體能夠查看Java Lambda表達式入門
若是你以爲Lambda的函數式編程很爽,就一直使用,可是Lambda有時候的性能並不必定比Java原來的代碼快,具體性能對比能夠看:java8特性lambda基本原理及性能分析
這裏引用了rxjava和rxandroid兩個RX的庫,
rxandroid用於線程切換
還有sqlbrite的庫是響應式數據查詢框架
咱們看一下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
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
咱們看看起本地數據源使用sqlBrite的變化
一開始建立出BriteDataBase mDataBasehelper
獲取本地數據
返回查詢數據
createQuery返回的是QueryObservable的數據類型,很明顯sqlBrite是兼容Observable的轉換
能夠看到mapToList會將其轉換爲Observable的數據
點擊左邊,那個紅色的標誌,能夠直接進入到調用到縮進的方法
這個是直接調用processTasks()的方法
三.總結
1.Rxjava的標識符運用
2.Lambda函數式編程,縮進運用和理解
3.SqlBrite數據庫的運用,只是配置RxJava轉換爲Observable對象的操做
這節就到這裏,
下一節將會更精彩!!!敬請期待。
羣號是316556016,也能夠掃碼進羣。我在這裏期待大家的加入!!!