Android 第三方库RxLifecycle使用
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
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使用的更多相关文章
- 教你自己写Android第三方库
其实Android studio的出现很大程度上方便了我们Android开发人员,今天我们说说怎么构建我们自己的库. 依次按File->New Moudle->android Librar ...
- Android 第三方库导致jar包冲突解决办法
这几天的任务是将mapbox的工程合到程序中去,但是合并过程却出现了问题 合并方法: 在app的build.gradle中添加 dependencies { compile ('com.mapbox. ...
- 阿里P8大佬熬夜10天,把所有Android第三方库整理成了PDF
缘起 随着互联网企业的不断发展,产品项目中的模块越来越多,用户体验要求也越来越高,想实现小步快跑.快速迭代的目的越来越难,还有应用之间的互相调用等等问题,插件化技术应用而生.如果没有插件化技术,美团. ...
- Android 第三方开源库收集整理(转)
原文地址:http://blog.csdn.net/caoyouxing/article/details/42418591 Android开源库 自己一直很喜欢Android开发,就如博客签名一样, ...
- 45.Android 第三方开源库收集整理(转)
原文地址:http://blog.csdn.net/caoyouxing/article/details/42418591 Android开源库 自己一直很喜欢Android开发,就如博客签名一样, ...
- Xamarin 绑定安卓第三方库恢复原始参数问题
大家都知道在绑定xamarin android 第三方库的时候 参数名是乱码的 变成了p1 p2 p3 之类的 这样在实际使用的时候非常不方便. 其实xamarin是提供了三种方式帮助大家恢复ja ...
- Android中的依赖问题(五种依赖、eclipse、AS、添加第三方库、jar)
这篇文章的主题是: 依赖是什么 eclipse中的依赖 AS中的依赖(有一篇详细的文章讲得非常好,这里就不再写了http://blog.csdn.net/yy1300326388/article/de ...
- Android JNI如何调用第三方库
http://www.2cto.com/kf/201504/388764.html Android JNI找不到第三方库的解决方案 cannot load library 最近做一个jni项目,拿到的 ...
- cocos2dx使用了第三方库照样移植android平台-解决iconv库的移植问题
当我写这篇文章的时候我是怀着激动的心情的,因为我又解决了一个技术问题.你可能对题目还一知半解,这是什么意思,我之所以要写这篇文章就是要解决当我们在cocos2dx中使用了第三方库的时候,移植到andr ...
随机推荐
- Linux 学习 三, linux 文件结构
linux 的文件结构 linux 下的bin 目录,包含了常用的命令应用程序 /bin: bin为binary的简写主要放置一些系统的必备执行档例如:cat.cp.dmesg.gzip.kill.l ...
- Form 头行附件查询
查询Form的头行附件: SELECT st.short_text order_short_text, description order_attach_desc, pk1_value order_ ...
- REP-0118:can not create temporary file(无法创建临时文件)
解决办法: 查看一下注册表里面的reports_tmp 的路径 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ORACLE\KEY_DevSuiteHome1 .是不 ...
- 洛谷 P1215 [USACO1.4]母亲的牛奶 Mother's Milk
题目描述 农民约翰有三个容量分别是A,B,C升的桶,A,B,C分别是三个从1到20的整数, 最初,A和B桶都是空的,而C桶是装满牛奶的.有时,农民把牛奶从一个桶倒到另一个桶中,直到被灌桶装满或原桶空了 ...
- C++ Eigen库和Matlab对比
// A simple quickref for Eigen. Add anything that's missing. // Main author: Keir Mierle #include &l ...
- April 16 2017 Week 16 Sunday
Happiness is a way station between too much and too little. 幸福就是刚刚好. I don't want to talk about it a ...
- webpack踩坑
1.当你用webpack2实现css文件单独成一个文件的时候: 可能遇到这种错误Error: Breaking change: extract now only takes a single argu ...
- OpenGL纹理高级
矩形纹理 对于二维纹理来说,除了GL_TEXTURE_2D之外,使用GL_TEXTURE_RECTANGLE就可以使用矩形纹理. 矩形纹理几大特点: 不能Mip,只能加载glTexImage2D的le ...
- LIS的string用法
题目链接 使用的是string里的find函数 stl大法好 #include<iostream> #include<cstdio> #include<cstring&g ...
- printf、sprintf与fprintf 的用法区分
原文链接 1: fprintf()#include <stdio.h> int fprintf( FILE *stream, const char *format, ... );fprin ...