rx android 内存泄露,Android性能优化之利用Rxlifecycle解决RxJava内存泄漏详解

本文介绍了如何使用Rxlifecycle框架来解决RxJava在Android开发中可能引发的内存泄漏问题。通过在Activity或Fragment中继承RxActivity或RxFragment,并结合bindUntilEvent()和bindToLifecycle()方法,实现Observable与组件生命周期的绑定,确保在组件销毁时自动取消订阅,防止内存泄漏。同时,文章提醒开发者注意技术选型和风险规避。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

其实RxJava引起的内存泄漏是我无意中发现了,本来是想了解Retrofit与RxJava相结合中是如何通过适配器模式解决的,结果却发现了RxJava是会引起内存泄漏的,所有想着查找一下资料学习一下如何解决RxJava引起的内存泄漏,就查到了利用Rxlifecycle开源框架可以解决,今天周末就来学习一下如何使用Rxlifecycle。

引用泄漏的背景:

RxJava作为一种响应式编程框架,是目前编程界网红,可谓是家喻户晓,其简洁的编码风格、易用易读的链式方法调用、强大的异步支持等使得RxJava被广泛使用,它通过线程调度器更容易控制和切换线程,如果该工作线程还没执行结束就退出Activity或者Fragment,就会Activity或者Fragment无法释放引起内存泄漏。

什么是Rxlifecycle?

rxlifecycle是trello开发的用于解决RxJava引起的内存泄漏的开源框架。

如何使用Rxlifecycle?

1.)在build.gradle文件中添加引用

compile 'com.trello:rxlifecycle:1.0'

// If you want to bind to Android-specific lifecycles

compile 'com.trello:rxlifecycle-android:1.0'

// If you want pre-written Activities and Fragments you can subclass as providers

compile 'com.trello:rxlifecycle-components:1.0'

// If you want to use Navi for providers

compile 'com.trello:rxlifecycle-navi:1.0'

// If you want to use Kotlin syntax

compile 'com.trello:rxlifecycle-kotlin:1.0'

根据自己的需要添加 我这里使用了如下两个

compile 'com.trello:rxlifecycle:1.0'

compile 'com.trello:rxlifecycle-components:1.0'

2.)根据不同的需要Activity继承RxActivity ,Fragment继承RxFragment

public class MainActivity7 extends RxActivity {

private TextView mTextView;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mTextView = (TextView) findViewById(R.id.text);

//模拟内存泄露

testRxJava();

finish();

}

private void testRxJava() {

Observable.create(new Observable.OnSubscribe() {

@Override

public void call(Subscriber super String> subscriber) {

int i = 0;

while (i < 1000000000) {

i++;

}

subscriber.onNext(String.valueOf(i));

subscriber.onCompleted();

}

}).compose(this.bindUntilEvent(ActivityEvent.PAUSE))

.subscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread())

.subscribe(new Action1() {

@Override

public void call(String s) {

mTextView.setText(s);

}

});

}

@Override

protected void onDestroy() {

super.onDestroy();

LApplication.getRefWatcher().watch(this);

}

}

目前支持的Activity/Fragment 结构图

6ae3af14e23d7abc99e26894c7ab5a9a.png

3.)使用bindToLifecycle()的方式

在子类使用Observable中的compose操作符,调用,完成Observable发布的事件和当前的组件绑定,实现生命周期同步。从而实现当前组件生命周期结束时,自动取消对Observable订阅。

Observable.create(new Observable.OnSubscribe() {

@Override

public void call(Subscriber super String> subscriber) {

int i = 0;

while (i < 1000000000) {

i++;

}

subscriber.onNext(String.valueOf(i));

subscriber.onCompleted();

}

}).compose(this.bindToLifecycle())

.subscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread())

.subscribe(new Action1() {

@Override

public void call(String s) {

mTextView.setText(s);

}

});

4.)使用bindUntilEvent()方式

使用ActivityEvent类,其中的CREATE、START、 RESUME、PAUSE、STOP、 DESTROY分别对应生命周期内的方法。使用bindUntilEvent指定在哪个生命周期方法调用时取消订阅。

Observable.create(new Observable.OnSubscribe() {

@Override

public void call(Subscriber super String> subscriber) {

int i = 0;

while (i < 1000000000) {

i++;

}

subscriber.onNext(String.valueOf(i));

subscriber.onCompleted();

}

}).compose(this.bindUntilEvent(ActivityEvent.PAUSE))

.subscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread())

.subscribe(new Action1() {

@Override

public void call(String s) {

mTextView.setText(s);

}

});

5.)自定义一个RxActivity/RxFragment

只需要你想要的Activity实现LifecycleProvider接口就可以了,这里贴出RxActivity的源码仿照它做下修改即可。

public abstract class RxActivity extends Activity implements LifecycleProvider {

private final BehaviorSubject lifecycleSubject = BehaviorSubject.create();

public RxActivity() {

}

@NonNull

@CheckResult

public final Observable lifecycle() {

return this.lifecycleSubject.asObservable();

}

@NonNull

@CheckResult

public final LifecycleTransformer bindUntilEvent(@NonNull ActivityEvent event) {

return RxLifecycle.bindUntilEvent(this.lifecycleSubject, event);

}

@NonNull

@CheckResult

public final LifecycleTransformer bindToLifecycle() {

return RxLifecycleAndroid.bindActivity(this.lifecycleSubject);

}

@CallSuper

protected void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

this.lifecycleSubject.onNext(ActivityEvent.CREATE);

}

@CallSuper

protected void onStart() {

super.onStart();

this.lifecycleSubject.onNext(ActivityEvent.START);

}

@CallSuper

protected void onResume() {

super.onResume();

this.lifecycleSubject.onNext(ActivityEvent.RESUME);

}

@CallSuper

protected void onPause() {

this.lifecycleSubject.onNext(ActivityEvent.PAUSE);

super.onPause();

}

@CallSuper

protected void onStop() {

this.lifecycleSubject.onNext(ActivityEvent.STOP);

super.onStop();

}

@CallSuper

protected void onDestroy() {

this.lifecycleSubject.onNext(ActivityEvent.DESTROY);

super.onDestroy();

}

}

总结:

本文总结了通过RxLifeCycle解决RxJava的内存泄漏问题,同时也给我们提了一个警告,再好的框架都有它好的一面也有坏的一面,这时做好技术选型以及规避风险就很重要了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值