版权声明:本文原创发布于公众号 wingjay,转载请务必注明出处! https://blog.csdn.net/lanxian837820149/article/details/88628985
大幅提高自身技术实力最有效的途径之一就是学习世界级优秀开源项目的精髓,而本人的《带你学开源项目》系列文章将持续更新,对当前Android开发界最优秀的开源项目进行深入分析。
一、 介绍
本人的《带你学开源项目系列文章》采取的分析思路不是从源码里抽代码出来一步步跟踪,了解其具体实现,而是通过提出问题,一步步思考解决方法,从而学习到开源项目的思维精华。笔者认为这种方式更有利于读者提高自身思维方式和技术能力。
二、 开源项目
RxLifecycle 地址:https://github.com/trello/RxLifecycle 。该项目是为了防止RxJava
中subscription
导致内存泄漏而诞生的,核心思想是通过监听Activity
、Fragment
的生命周期,来自动断开subscription
以防止内存泄漏。
基本用法如下:
myObservable
.compose(RxLifecycle.bindUntilEvent(lifecycle, ActivityEvent.DESTROY))
.subscribe();
此处myObservable
可以看成一个耗时的网络请求,通过绑定到ActivityEvent.DESTROY
,一旦Activity发生了DESTORY
生命周期,数据就不会再流向subscriber
,即不会对这些数据进行任何处理和UI绘制,从而提高安全性。
三、 问题
Android开发中常会有这样一个场景:
- 发送网络请求 -> 2. 服务器处理请求并返回数据 -> 3. client端接收数据,绘制UI。
在前两步一般都是不会出现问题的,但是在第三步,当数据返回给client端时,如果页面已经不在了,那么就无法去绘制UI,很有可能会导致意向不到的问题。因此,为了解决这个问题,一个好的思路就是当页面离开时,自动断开网络请求数据的处理过程,即数据返回后不再进行任何处理
。
四、 思考
要达到上面这样一个功能,我们可以思考,至少需要两部分:
- 随时监听
Activity
(Fragment
)的生命周期并对外发射出去; - 在我们的网络请求中,接收生命周期并进行判断,如果该生命周期是自己绑定的,如
Destory
,那么就断开数据向下传递的过程。
五、 分析
可以看到,首先有一个核心功能要实现:就是既能够监听Activity
生命周期事件并对外发射,又能够接收每一个生命周期事件并作出判断。为了实现这个功能,可以联想到RxJava
中的Subject
,既能够发射数据,又能够接收数据。
六、 Subject介绍
了解Subject
的读者可以跳过这部分。
如何理解Subject
呢?
很容易,在RxJava里面,Observable
是数据的发射者,它会对外发射数据,然后经过map
、flatmap
等等数据处理后,最终传递给Observer
,这个数据接收者。因此,抛开中间数据处理不管,可以看出,Observable
对外发射数据,是数据流的开端;Observer
接收数据,是数据流的末端。
那么Subject
呢?看一眼源码:
/**
* Represents an object that is both an Observable and an Observer.
*/
public abstract class Subject<T, R> extends Observable<R> implements Observer<T> {}
首先,它extends Observable<R>
,说明Subject
具备了对外发射数据的能力,