大家好,我是苍王。
以下是我这个系列的相关文章,有兴趣可以参考一下,可以给个喜欢或者关注我的文章。
[Android]如何做一个崩溃率少于千分之三噶应用app--章节列表
相信有关注我的人,都会看过我第一编介绍的Todo-mvp源码体验,这是基础编。
这一节给大家分享的RXJAVA和MVP设计之间的架构。
当然看这篇文章前,希望你有一定的Rxjava的基础知识。
一.Lambda
这里需要介绍一下Java8的新特性,你可以叫这东西为闭包,起是属于一种函数式编程
官方配置
buildToolVersion需要使用24以上,因为Android N以后的build Tool才支持

配置打开jackOptions
使用新的 Java 8 语言功能,还需使用新的 Jack 工具链。新的 Android 工具链将 Java 源语言编译成 Android 可读取的 Dalvik 可执行文件字节码,且有其自己的 .jack 库格式,在一个工具中提供了大多数工具链功能:重新打包、压缩、模糊化以及 Dalvik 可执行文件分包。

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,也可以扫码进群。我在这里期待你们的加入!!!

网友评论