Android性能优化之利用Rxlifecycle解决RxJava内存泄漏

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

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

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

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

如何使用Rxlifecycle?
1.)在build.gradle文件中添加引用
compile ‘com.trello.rxlifecycle2:rxlifecycle:2.2.1’

// If you want to bind to Android-specific lifecycles
compile ‘com.trello.rxlifecycle2:rxlifecycle-android:2.2.1’

// If you want pre-written Activities and Fragments you can subclass as providers
compile ‘com.trello.rxlifecycle2:rxlifecycle-components:2.2.1’

// If you want pre-written support preference Fragments you can subclass as providers
compile ‘com.trello.rxlifecycle2:rxlifecycle-components-preference:2.2.1’

// If you want to use Navi for providers
compile ‘com.trello.rxlifecycle2:rxlifecycle-navi:2.2.1’

// If you want to use Android Lifecycle for providers
compile ‘com.trello.rxlifecycle2:rxlifecycle-android-lifecycle:2.2.1’

// If you want to use Kotlin syntax
compile ‘com.trello.rxlifecycle2:rxlifecycle-kotlin:2.2.1’

// If you want to use Kotlin syntax with Android Lifecycle
compile ‘com.trello.rxlifecycle2:rxlifecycle-android-lifecycle-kotlin:2.2.1’
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<String>() {
        @Override
        public void call(Subscriber<? super String> subscriber) {
            int i = 0;
            while (i < 1000000000) {
                i++;
            }
            subscriber.onNext(String.valueOf(i));
            subscriber.onCompleted();
        }
    }).compose(this.<String>bindUntilEvent(ActivityEvent.PAUSE))
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Action1<String>() {
                @Override
                public void call(String s) {
                    mTextView.setText(s);
                }
            });

}


@Override
protected void onDestroy() {
    super.onDestroy();
    LApplication.getRefWatcher().watch(this);
}

}

目前支持的Activity/Fragment 结构图

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

Observable.create(new Observable.OnSubscribe() {
@Override
public void call(Subscriber

猜你喜欢

转载自blog.csdn.net/watertekhqx/article/details/80197073