RxLifecycle使用 解决Rxjava编程的内存泄露问题

RxLifecycle是什么?

This library allows one to automatically complete sequences based on a second lifecycle stream.

This capability is useful in Android, where incomplete subscriptions can cause memory leaks.

通俗的说:可以通过绑定生命周期的方式,来解决内存泄漏的问题

开源地址
rxlifecycle是trello开发的用于解决RxJava引起的内存泄漏的开源框架。传送门
Android studio中的依赖与使用

1.)在build.gradle文件中添加依赖

// RxLifecycle基础库
compile 'com.trello.rxlifecycle2:rxlifecycle:2.1.0'
// Android组件库,里面定义了例如RxAppCompatActivity、RxFragment之类的Android组件
compile 'com.trello.rxlifecycle2:rxlifecycle-components:2.1.0'

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

public class MainActivity7 extends RxActivity {
    private TextView mTextView;
    private static final String TAG = "RxLifecycle";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTextView = (TextView) findViewById(R.id.text);
        Observable.interval(1, TimeUnit.SECONDS)
            .doOnUnsubscribe(new Action0() {
                @Override
                public void call() {
                    Log.i(TAG, "Unsubscribing subscription from onCreate()");
                }
            })
            .subscribe(new Action1<Long>() {
                @Override
                public void call(Long num) {
                    Log.i(TAG, "Started in onCreate(), running until onPause(): " + num);
                }
            });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
    }
}

当activity对象被销毁,而我们的在rxjava中执行一些耗时的操作(例如:网络访问–>成功获取数据–>刷新UI;文件的存储等),就会造成内存泄露的现象。
3.)使用bindToLifecycle()的方式 —->绑定生命周期,自动取消订阅
完成Observable发布的事件和当前的组件绑定,实现生命周期同步。从而实现当前组件生命周期结束时,自动取消对Observable订阅。

    Observable.interval(1, TimeUnit.SECONDS)
            .doOnUnsubscribe(new Action0() {
                @Override
                public void call() {
                    Log.i(TAG, "Unsubscribing subscription from onCreate()");
                }
            })
            //Note:bindToLifecycle的自动取消订阅示例,因为是在onStart的时候调用,所以在onStop的时候自动取消订阅
            .compose(this.<Long>bindToLifecycle())
            .subscribe(new Action1<Long>() {
                @Override
                public void call(Long num) {
                    Log.i(TAG, "Started in onCreate(), running until onPause(): " + num);
                }
            });
    }

4.)使用bindUntilEvent()方式—>手动设置取消订阅的时机
使用CREATE、START、 RESUME、PAUSE、STOP、 DESTROY分别对应生命周期内的方法。使用bindUntilEvent指定在哪个生命周期方法调用时取消订阅。

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

参考:RxAndroid之Rxlifecycle使用

阅读更多

没有更多推荐了,返回首页