Rx系列Android技术知识RxJava

RxJava+MVP模式下的Nucles框架

2016-08-24  本文已影响2036人  优疏

内存泄漏分析

最近在学习MVP架构模式中,一直模糊与MVP模式真正能带来什么,我们能从中收获什么。浅显地来说代码分层,易于重构和维护,代码结构分析。但真正在使用过程中,感觉又是可有可无的东西。接下来是我这一天学习查阅资料的体会。

Android项目性能优化中有个必须关注的点是内存泄漏,下面篇幅不在细说内存泄漏工具检测,而在重点说明在实际场景中造成内存泄漏的原因以及解决方案和MVP模式的好处。

线程耗时这种操作是无法避免的,这时就可以使用MVP模式了,把耗时操作放入Presenter中执行,可以定义static静态Presenter,让其不持有Activity对象,这是一种解决思路,但我们可以通过别人对MVP模式的封装来优化内存泄漏的问题。

备注:AsyncTask和RxJava处理异步时,cancle或者unsubscribe仅是不触发onPostExecute或onNext。异步操作还是在跑的,只是没通知回调而已,这个是以前的误区。所以这种内存消耗是无法避免的,我们的优化点就在于避免不必要的异步耗时请求

通常意义上Presenter都有持有View对象,而View经常是Activity和Fragment来扮演,那这不就是矛盾了吗?在Presenter会执行网络请求这些耗时操作,请求结束后会让View作出反馈,那当Activity或者Fragment释放时由于Presenter持有对象那就会Acitivity或者Fragment释放不了可能导致内存泄露的发生。那么怎么解决这个问题呢?可以在View onDestroy销毁时执行Presenter解绑View操作,让View置null,通知GC释放View。当View重新置于前台时让Presenter重新绑定。

Nucles框架

下面会花一定篇幅来介绍MVP封装库Nucles,而Nucles是什么呢,有什么好处?

Paste_Image.png

RequiesPresenter:自定义注解,方便工厂加工Presenter实例
PresenterStorage:Presenter存储单例,方便View重启恢复Presenter
RxPresenter:实现对业务的封装,对业务做解绑操作等
PresenterLifecycleDelegate:Presenter生命周期委托,其中的方法对应View的生命周期。如onSaveInstanceState保存Presenter相关至View的bundlestate,以便onRestoreInstanceState时恢复
NucleusActivity/NucleusFragment/NucleusLayout:持有PresenterLifecycleDelegate对象,统一PresenterLifecycleDelegate管理Presenter生命周期
Delivery相关:涉及RxJava部分,通常是建议Presenter不直接操作View,Delivery实现Observable<数据源>->Observable<View,数据源>转换,动态操作View

通过一张图来作分析:


Paste_Image.png

<View,T>分别对应View对象和数据源。Observable<T>是如通过Retrofit网络请求到的数据源操作。我们需要将数据源操作转换成对View和数据源两者的操作。从中而知我们需要封装个Delivery对象存放View和数据源,然后将网络请求转换成对Delivery。最终subscribe订阅后让Delivery内部处理特定逻辑。那么View对象是从哪里获取到的呢,答案就在构造参数Observable<View> view对象中,这个对象是声明在RxPresenter中的private final BehaviorSubject<View> views = BehaviorSubject.create();

最后附上例子:
https://github.com/hhhhskfk/oschina-mvp

RxJava介绍

BehaviorSubject:相当于Observable或者Subscriber,这个作用是当被订阅后执行onNext执行具体操作后,会优先发送一个默认值
SubscriptionList:Subscription列表,管理列表中订阅的解除
Observable.first():仅在第一次订阅中执行
combineLatest():作用于最近发射的数据项:如果Observable1发射了A并且Observable2发射了B和C,combineLatest()将会分组处理AB和AC

具体RxJava干货请看这里

Awesome-RxJava

RxJava resources

Blog

开发者前线翻译的一系列很赞的教程

一些不错的介绍操作符的文章

一些不错的翻译文章

一些原理分析的文章

Test

App

Example

Library

Stackoverflow

Video

上一篇下一篇

猜你喜欢

热点阅读