你们好,我是苍王。
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,也能够扫码进群。我在这里期待大家的加入!!!