TODO-MVP-RXJAVA 源码体验

大家好,我是苍王。

以下是我这个系列的相关文章,有兴趣可以参考一下,可以给个喜欢或者关注我的文章。

[Android]如何做一个崩溃率少于千分之三噶应用app–章节列表

相信有关注我的人,都会看过我第一编介绍的Todo-mvp源码体验,这是基础编。

这一节给大家分享的RXJAVA和MVP设计之间的架构。

当然看这篇文章前,希望你有一定的Rxjava的基础知识。

一.Lambda

这里需要介绍一下Java8的新特性,你可以叫这东西为闭包,起是属于一种函数式编程

官方配置

buildToolVersion需要使用24以上,因为Android N以后的build Tool才支持

《TODO-MVP-RXJAVA 源码体验》

配置打开jackOptions

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

《TODO-MVP-RXJAVA 源码体验》

java版本数需要引用java1.8

《TODO-MVP-RXJAVA 源码体验》

Instant Run目前不能用于 Jack,在使用新的工具链时将被停用。

可以看这里的介绍:使用 Java 8 语言功能

****2017.3.27*****

刚发布,就听到群内的同学说jack要被google废弃了,详情请见Future of Java8

《TODO-MVP-RXJAVA 源码体验》

兼容性第三方配置

buildTool在24之前那么只能使用兼容包了

在项目的build gradle需要配置retrolambda的引用

《TODO-MVP-RXJAVA 源码体验》

也有推荐这样的配置

《TODO-MVP-RXJAVA 源码体验》

然后每个module的build.gradle还需要配置

《TODO-MVP-RXJAVA 源码体验》

Lambda原理

或者你感觉和内部匿名类的缩进后差不多(如Runnable),其原理并非如此。

其实际是使用了invokeDynamic指令,运行时调用LambdaMetafactory.metafactory动态的生成内部类,实现了接口,内部类里的调用方法块并不是动态生成的,只是在原class里已经编译生成了一个静态的方法,内部类只需要调用该静态方法

这里不做深入的解析,具体可以参考Java 8 动态类型语言Lambda表达式实现原理分析

Lambda还能配合Streams做更多一些操作,具体可以查看Java Lambda表达式入门

如果你觉得Lambda的函数式编程很爽,就一直使用,但是Lambda有时候的性能并不一定比Java原来的代码快,具体性能对比可以看:java8特性lambda基本原理及性能分析

二.源码分析

1.相关引用

这里引用了rxjava和rxandroid两个RX的库,

rxandroid用于线程切换

还有sqlbrite的库是响应式数据查询框架

《TODO-MVP-RXJAVA 源码体验》

2.线程调度

我们看一下TaskPresenter的创建,需要传入taskRepository,View对象,还有SchedulerProvider对象(RxAndroid线程切换)

《TODO-MVP-RXJAVA 源码体验》

这里面数据源也会使用

《TODO-MVP-RXJAVA 源码体验》

其封装了三个RxAndroid的线程接口

Schedulers.computation( )用于计算任务,如事件循环或和回调处理

Schedulers.io( )用于IO密集型任务,如异步阻塞IO操作,这个调度器的线程池会根据需要增长

AndroidSchedulers.mainThread() 运行在Android UI线程上

《TODO-MVP-RXJAVA 源码体验》

这里面CompositeSubscription是Subject的集合,可以用于统一释放。

《TODO-MVP-RXJAVA 源码体验》

这里mTasksView.setPresenter会将TasksFragment连接起来。

通过TasksFragment的onResume和onPause生命周期做一些绑定操作

《TODO-MVP-RXJAVA 源码体验》

TaskPresteners的绑定方法,使用的是加载数据loadTasks

《TODO-MVP-RXJAVA 源码体验》

3.数据加载

loadTasks里面会有很多RxJava的操作符,这里慢慢解析

《TODO-MVP-RXJAVA 源码体验》

Subscription Observable.subscribe绑定的时候会返回一个Subscription的对象

《TODO-MVP-RXJAVA 源码体验》

getTasks方法中获取远程数据和本地数据

concat的操作符是用于依次将多个数据源释放到同一个地方。

filter过滤掉空的任务

first是返回第一条符合要求的数据

起最终返回的是Observable<List<Task>>的数据

《TODO-MVP-RXJAVA 源码体验》

flatMap将List<Task> tasks对象转化为Observable<Task>

from会依次返回List中的每个item

filter里面过滤掉是否进行中的任务(这个是记事本本来的逻辑)

toList将其组装成List的对象

《TODO-MVP-RXJAVA 源码体验》

subscribeOn和observeOn都是用来切换线程用的

subscribeOn的调用,改变了调用前序列所运行的线程。subscribeOn改变的是subscribe这句调用所在的线程

observeOn对之前的序列产生的结果先缓存起来,然后再在指定的线程上,推送给最终的subscriber

请注意这三点!!!

subscribeOn的调用切换之前的线程。

observeOn的调用切换之后的线程。

observeOn之后,不可再调用subscribeOn切换线程

数据正常发送完毕doOnCompleted会被触发

《TODO-MVP-RXJAVA 源码体验》

我们看看Subscribe,感觉我们平时见到的Subscribe有一定的区别,利用了lamba缩进

《TODO-MVP-RXJAVA 源码体验》

其真实效果是会这样的

《TODO-MVP-RXJAVA 源码体验》

这里需要添加subscription到CompositeSubscription统一管理

《TODO-MVP-RXJAVA 源码体验》

TaskFragment里面onPause当中调用unsubscribe()

《TODO-MVP-RXJAVA 源码体验》

然后使用CompositeSubscription清除所有的Subscription

《TODO-MVP-RXJAVA 源码体验》

4.数据源变化

我们看看起本地数据源使用sqlBrite的变化

一开始创建出BriteDataBase mDataBasehelper

《TODO-MVP-RXJAVA 源码体验》

获取本地数据

《TODO-MVP-RXJAVA 源码体验》

返回查询数据

createQuery返回的是QueryObservable的数据类型,很明显sqlBrite是兼容Observable的转换

《TODO-MVP-RXJAVA 源码体验》

可以看到mapToList会将其转换为Observable的数据

《TODO-MVP-RXJAVA 源码体验》

5.缩进进入

点击左边,那个红色的标志,可以直接进入到调用到缩进的方法

《TODO-MVP-RXJAVA 源码体验》

这个是直接调用processTasks()的方法

《TODO-MVP-RXJAVA 源码体验》

三.总结

1.Rxjava的标识符运用

2.Lambda函数式编程,缩进运用和理解

3.SqlBrite数据库的运用,只是配置RxJava转换为Observable对象的操作

这节就到这里,

下一节将会更精彩!!!敬请期待。

群号是316556016,也可以扫码进群。我在这里期待你们的加入!!!

《TODO-MVP-RXJAVA 源码体验》

    原文作者:java集合源码分析
    原文地址: https://juejin.im/post/58d87b8eb123db199f43abfd
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞