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

相关文章
相关标签/搜索