1.简单介绍RxLifecycle

1.1.使用原因。

  在使用rxjava的时候,如果没有及时解除订阅,在退出activity的时候,异步线程还在执行。

  对activity还存在引用,此时就会产生内存泄漏。

  RxLifecycle就是为了解决rxjava导致的内存泄漏而产生的。

1.2.RxLifecycle可以做到什么呢?  

  它可以让Observable发布的事件和当前的组件绑定,实现生命周期同步。

  从而实现当前组件生命周期结束时,自动取消对Observable订阅。

  核心思想:通过监听Activity、Fragment的生命周期,来自动断开订阅防止内存泄漏。

1.3.参考文献。

  RxAndroid的github地址:https://github.com/ReactiveX/RxAndroid

  Rxlifecycle的github地址:https://github.com/trello/RxLifecycle

  参考文章:Rxlifecycle使用详解。

  参考文章:在mvp中使用rxlifecycle避免rxjava的内存泄漏。  

2.使用方法

2.1.添加最新的依赖 

//rxjava的依赖
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'io.reactivex.rxjava2:rxjava:2.1.7'
//rxlifecycle的依赖
compile 'com.trello.rxlifecycle2:rxlifecycle-android-lifecycle-kotlin:2.2.1'

2.2.Activity以及Fragment的继承

  Activity需要继承RxAppCompatActivity。==>比如这么一个类

public class BaseActivity extends RxAppCompatActivity

  Fragment需要继承RxFragment。==>比如这么一个类

public abstract class BaseFragment<T extends IBasePresenter>
extends RxFragment
implements IBaseView<T>

2.3.绑定生命周期。

  自己写一个接口,里面定义一个bindToLife()函数。  

 /**
* 绑定生命周期
*/
<T> LifecycleTransformer<T> bindToLife();

  这个bindToLife()是自定义的名字,这里就叫做bindToLife好了。

  这个接口是自己定义的一个接口,我让Fragment来继承这个接口。

  这个返回的是一个LifecycleTransformer<T>,这个官方的一个类。而且这里使用了泛型,更加通用了。

2.4.在自己的Fragment中实现这个接口函数。 

/**
* 绑定生命周期
*/
@Override
public <T> LifecycleTransformer<T> bindToLife() {
return bindUntilEvent(FragmentEvent.DESTROY);
}

  这里调用了官方的一个bindUntilEvent的方法,以此函数来绑定生命周期。

  这里的FragmentEvent.DESTROY,顾名思义,就是当Fragment销毁的时候,自动解除订阅关系。

  

  注意:这里使用了FragmentEvent类,其中的CREATE/START/RESUME/PAUSE/STOP/DESTROY  

        分布对应生命周期内的方法。使用bindUntilEvent指定在哪个生命周期方法调用示取消订阅。

2.5.在请求API函数的时候,执行自己写的bindToLife()

    调用Observable<T>.compose(执行接口中的bindToLife())

  compose里面的东西应该是:LifecycleTransformer<T>。 

3.对于Rxlifecycle的理解

3.1.使用原因就不用多说了,解决RxJava导致的内存泄漏。

3.2.因为activity和fragment控制切换线程的时候,引用没有清除干净,所以就把手脚着重于activity和fragment的

  生命周期了,就是说,如果你的活动如果碰到意外或者用户主动销毁,那么也断开订阅,就是订阅的生命周期

  和活动的生命周期已经融为一体了,那就不用担心再发生内存泄漏了,所以这种绑定生命周期的方法是从根本

  上解决了内存泄漏。感觉没有更好的方法解决了。

3.3.其实官方为了两种解决方案。

  一种是手动取消订阅,我不知道怎么用,也没有实战过。

  这里提供一下大神的文章:RxAndroid之Rxlifecycle使用。

  手动设置在activity onPause的时候取消订阅。

private static final String TAG = "RxLifecycle";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate()");
setContentView(R.layout.activity_main); Observable.interval(1, TimeUnit.SECONDS)
.doOnUnsubscribe(new Action0() {
@Override
public void call() {
Log.i(TAG, "Unsubscribing subscription from onCreate()");
}
})
//Note:手动设置在activity onPause的时候取消订阅
.compose(this.<Long>bindUntilEvent(ActivityEvent.PAUSE))
.subscribe(new Action1<Long>() {
@Override
public void call(Long num) {
Log.i(TAG, "Started in onCreate(), running until onPause(): " + num);
}
});
}

  手动设置在activity的onDestroy的时候取消订阅。

@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "onResume()"); // `this.<Long>` is necessary if you're compiling on JDK7 or below.
// If you're using JDK8+, then you can safely remove it.
Observable.interval(1, TimeUnit.SECONDS)
.doOnUnsubscribe(new Action0() {
@Override
public void call() {
Log.i(TAG, "Unsubscribing subscription from onResume()");
}
})
//Note:手动设置在activity onDestroy的时候取消订阅
.compose(this.<Long>bindUntilEvent(ActivityEvent.DESTROY))
.subscribe(new Action1<Long>() {
@Override
public void call(Long num) {
Log.i(TAG, "Started in onResume(), running until in onDestroy(): " + num);
}
});
}

  自动设置取消订阅,默认在onStart的时候调用,在onStop的时候取消订阅。

@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "onStart()");// Using automatic unsubscription, this should determine that the correct time to
// unsubscribe is onStop (the opposite of onStart).
Observable.interval(1, TimeUnit.SECONDS)
.doOnUnsubscribe(new Action0() {
@Override
public void call() {
Log.i(TAG, "Unsubscribing subscription from onStart()");
}
})
//Note:bindToLifecycle的自动取消订阅示例,因为是在onStart的时候调用,所以在onStop的时候自动取消订阅
.compose(this.<Long>bindToLifecycle())
.subscribe(new Action1<Long>() {
@Override
public void call(Long num) {
Log.i(TAG, "Started in onStart(), running until in onStop(): " + num);
}
});
}

Android 第三方库RxLifecycle使用的更多相关文章

  1. 教你自己写Android第三方库

    其实Android studio的出现很大程度上方便了我们Android开发人员,今天我们说说怎么构建我们自己的库. 依次按File->New Moudle->android Librar ...

  2. Android 第三方库导致jar包冲突解决办法

    这几天的任务是将mapbox的工程合到程序中去,但是合并过程却出现了问题 合并方法: 在app的build.gradle中添加 dependencies { compile ('com.mapbox. ...

  3. 阿里P8大佬熬夜10天,把所有Android第三方库整理成了PDF

    缘起 随着互联网企业的不断发展,产品项目中的模块越来越多,用户体验要求也越来越高,想实现小步快跑.快速迭代的目的越来越难,还有应用之间的互相调用等等问题,插件化技术应用而生.如果没有插件化技术,美团. ...

  4. Android 第三方开源库收集整理(转)

    原文地址:http://blog.csdn.net/caoyouxing/article/details/42418591 Android开源库 自己一直很喜欢Android开发,就如博客签名一样,  ...

  5. 45.Android 第三方开源库收集整理(转)

    原文地址:http://blog.csdn.net/caoyouxing/article/details/42418591 Android开源库 自己一直很喜欢Android开发,就如博客签名一样,  ...

  6. Xamarin 绑定安卓第三方库恢复原始参数问题

    大家都知道在绑定xamarin android 第三方库的时候 参数名是乱码的 变成了p1  p2  p3 之类的 这样在实际使用的时候非常不方便. 其实xamarin是提供了三种方式帮助大家恢复ja ...

  7. Android中的依赖问题(五种依赖、eclipse、AS、添加第三方库、jar)

    这篇文章的主题是: 依赖是什么 eclipse中的依赖 AS中的依赖(有一篇详细的文章讲得非常好,这里就不再写了http://blog.csdn.net/yy1300326388/article/de ...

  8. Android JNI如何调用第三方库

    http://www.2cto.com/kf/201504/388764.html Android JNI找不到第三方库的解决方案 cannot load library 最近做一个jni项目,拿到的 ...

  9. cocos2dx使用了第三方库照样移植android平台-解决iconv库的移植问题

    当我写这篇文章的时候我是怀着激动的心情的,因为我又解决了一个技术问题.你可能对题目还一知半解,这是什么意思,我之所以要写这篇文章就是要解决当我们在cocos2dx中使用了第三方库的时候,移植到andr ...

随机推荐

  1. iOS - The identity used to sign the executable is no longer valid

    ①.首先在xcode中的Build Settings中看有没有设置: ②.账号是不是多个人在用,个人开发者的账号只能绑定一台电脑,当另外一台电脑绑定了话,你的电脑就失效了.你确认下是不是这个原因造成的 ...

  2. 栅格那点儿事(四C)

    栅格渲染之拉伸(Stretch) 现在我们知道如何在ArcGIS中渲染栅格数据了,但是还有一个常常会碰到的问题,尤其是在使用老版本的ArcGIS的时候,为啥我加了一个栅格数据进来,啥也看不见,是黑色的 ...

  3. python模块详解 hashlib

    hashlib模块 用于加密相关的操作,在python3中替代了md5和sha模块,主要提供SHA和MD5算法. MD5 import hashlib m = hashlib.md5() #调用md5 ...

  4. 用SQL将数字转换为中文数字

    IF OBJECT_ID('fn_GetChnNum') IS NOT NULL BEGIN DROP FUNCTION dbo.fn_GetChnNum; END; GO CREATE FUNCTI ...

  5. Linux目录与文件的权限意义

    ls -l和ls -al的区别:第一个不会显示隐藏文件,第二个会显示隐藏文件(以点(.)开头的文件) 一.权限对文件(r.w.x主要针对文件的内容而言)的重要性 r:可读取文件内容 w:可以编辑.新增 ...

  6. Linux远程桌面(三)

    上一篇中的vnc配置已经很方便了,这一篇介绍更为简单的xmanager的配置,xmanager画面好一丢丢. Xmanager服务器配置             Linux远程桌面(二):vnc之xi ...

  7. cesium 显示视角高度以及鼠标经纬度

    HTML中的内容 <div id="cesiumContainer"> <!-- 设置经纬度显示 --> <span style="font ...

  8. 罗技G502设置

    这个鼠标默认内置了3个档案模式,用G9键来调节. p2 蓝色 1个灯 p2 蓝色 2个灯 p3 蓝色 3个灯 如此循环设置

  9. cocos2d-x 3.0 创建项目

    cocos2d-x 3.0 创建项目  点击打开链接

  10. 雷达覆盖,贪心,类似活动安排(POJ1328)

    题目链接:http://poj.org/problem?id=1328 解题报告: 1.按照头结点排序. #include <cstdio> #include <cmath> ...