Android_I Say No系列——项目框架(三)RxLif
Github上有一个开源项目RxLifecycle,使用的人非常多,目前有3400+的Star,这个东东利用Rxjava实现,思路真的很棒。有很多时候想引入它到项目中,但有两个原因让我望而却步:1、必须继承它给定的Activity等,Java是单继承所以你懂的;2、包含许多自己用不到的功能,对我来说臃肿。别人的东东用来学习甚好,拿来做开发的话笔者并不能感到满足。
所以,综合种种理由,我们要大声的喊出来,I say no!我要自己写,我要用自己的!
目录导读:
1、原理;
2、实现;
3、使用。
原理
刚开始我们没有思路,那就需要借鉴学习了(扒源码或百度+google),我们发现了两个重要的东东:BehaviorSubject类、takeUntil操作符。
BehaviorSubject类特点:
官方注释:Subject that emits the most recent item it has observed and all subsequent observed items to each subscribed,意思是说当订阅的时候它会发射最近的数据给订阅者,如果没有数据就发送一个默认值(看下面的流程图更加明白,有没有感觉它就像是为Lifecycle定做的一样)。
BehaviorSubject 流程图takeUntil操作符特点(这个操作符有两个重载方法):
重载一的注释:Returns an Observable that emits the items emitted by the source Observable until a second ObservableSource emits an item,意思是当传入的那个被观察者发射数据的时候,当前这个被观察者才会发射数据;
takeUntil 重载一 takeUntil 重载一重载二的注释:Returns an Observable that emits items emitted by the source Observable, checks the specified predicatefor each item, and then completes when the condition is satisfied,意思是比较每个发送的item,当符合条件时才把之后的数据都发送给订阅者;
takeUntil 重载二 takeUntil 重载二经过比较,我们发现第二种takeUntil重载方法并不适合,第一种takeUnti重载方法正适合。
实现
1、首先,我们定义一些枚举量来表示Fragment的各个生命周期:
Fragment的生命周期常量2、利用Rx2的filter和takeUntil操作符封装方法返回ObservableTransformer便于使用compose,避免每个订阅操作中单独去写这一堆代码:
Lifecycle工具类3、使用BehaviorSubject在Fragment的生命周期变化的时候发送代表其状态的枚举量(还应该在onDestroy中presenter.detach后清除这个BehaviorSubject变量,这里没写完美):
Fragment寿命周期状态值的发送其实这个时候已经完全可用了,直接调用LifecycleUtils的bindUtil方法传入相应的参数就行了;但是我们的网络操作一般写在Presenter中,难道我们再传入view.lifecycleBehavior么,忒不优雅了......
4、这个时候我们可以对View层的顶级父接口动刀子了,定义bindToLifecycle方法(如果你开发中只需要订阅某一个生命周期,那还完全可以省去第二个参数吖):
View层顶级父接口然后在BaseMvpFragment中实现这个方法,那Presenter层再调用,不就很优雅了么.....
BaseMvpFragment实现接口方法使用
封装后依然是使用compose操作符,只需一行够不够爽(这里展示的是在Presenter里调用,在View曾是直接可以调用的嘛):
在Presenter中使用总结:学习使我进步并使我快乐,时常进行一些总结是我感到满足,加油!