Rx系列内存管理About Rx

Android_I Say No系列——项目框架(三)RxLif

2017-04-27  本文已影响2266人  鱼满楼

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中使用

总结:学习使我进步并使我快乐,时常进行一些总结是我感到满足,加油!


安卓开发交流:

有兴趣一起学习的朋友,请加Q群:76161364
上一篇下一篇

猜你喜欢

热点阅读