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

来源:互联网 发布:紫川软件招聘 编辑:程序博客网 时间:2024/05/29 15:08

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使用

阅读全文
1 0
原创粉丝点击