美文网首页Rx系列内存管理About Rx
Android_I Say No系列——项目框架(三)RxLif

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

作者: 鱼满楼 | 来源:发表于2017-04-27 00:38 被阅读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

    相关文章

      网友评论

      • Distance_2365:文章很好,能不能给个源码研究一下
        鱼满楼:@Distance_2365 FragmentLifecycle事实上只是一个常量而已,ActivityLifecycle和FragmentLifecycle可以共用成一个枚举类。
        Distance_2365:@鱼满楼 那请问在IbaseView里传的FragmentLifecycle 换成activity的该如何处理。
        鱼满楼:@Distance_2365 抱歉,时隔太久代码没了,还是自己根据文章写一遍吧,本文较短代码也不是很多。

      本文标题:Android_I Say No系列——项目框架(三)RxLif

      本文链接:https://www.haomeiwen.com/subject/cbnbzttx.html