Rxlifecycle使用介绍

随着RxJavaRxAndroid越来越被世android开发工程师所熟知,使用的人也越来越多。

  • 它虽然使用起来代码结构能够更加清晰,切换线程更自如,优点多多。
  • 但如果使用不好,也是很容易导致内存泄露的。
    本文在这里介绍推荐使用Rxlifecycle,该项目就是为了防止RxJava使用不当导致内存泄漏而生的,核心思想是监听Activity、Fragment的生命周期,通过代码设定来自动断开subscription以防止内存泄漏。

Rxlifecycle简要介绍

  • 开源地址:RxLifecycle
  • 可按需要需要选择引入:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    compile 'com.trello.rxlifecycle2:rxlifecycle:2.1.0'

    // If you want to bind to Android-specific lifecycles
    compile 'com.trello.rxlifecycle2:rxlifecycle-android:2.1.0'

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

    // If you want to use Navi for providers
    compile 'com.trello.rxlifecycle2:rxlifecycle-navi:2.1.0'

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

    // If you want to use Kotlin syntax
    compile 'com.trello.rxlifecycle2:rxlifecycle-kotlin:2.1.0'

    // If you want to use Kotlin syntax with Android Lifecycle
    compile 'com.trello.rxlifecycle2:rxlifecycle-android-lifecycle-kotlin:2.1.0'
    如果是java开发一般使用前三个。

简单示例

示例1:以下示例是在间隔1秒中打印Started in onCreate(), running until onPause(): “ + num,然后执行到OnPause时回收Observable停止打印前者,执行doOnDispose并打印Unsubscribing subscription from onCreate()

  • 关键语句 compose(this.bindUntilEvent(ActivityEvent.PAUSE))
    • 绑定生命周期在Aactivity的onPause()解绑回收
    • Long是Observable对应的数据类型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 // Specifically bind this until onPause()
Observable.interval(1, TimeUnit.SECONDS)
.doOnDispose(new Action() {
@Override
public void run() throws Exception {
Log.i(TAG, "Unsubscribing subscription from onCreate()");
}
})
.compose(this.<Long>bindUntilEvent(ActivityEvent.PAUSE))
.subscribe(new Consumer<Long>() {
@Override
public void accept(Long num) throws Exception {
Log.i(TAG, "Started in onCreate(), running until onPause(): " + num);
}
});

示例二:

  • 使用自动取消订阅,在方法在onStart设置了,执行到onStop则会自动结束生命周期,销毁。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Observable.interval(1, TimeUnit.SECONDS)
    .doOnDispose(new Action() {
    @Override
    public void run() throws Exception {
    Log.i(TAG, "Unsubscribing subscription from onStart()");
    }
    })
    .compose(this.<Long>bindToLifecycle())
    .subscribe(new Consumer<Long>() {
    @Override
    public void accept(Long num) throws Exception {
    Log.i(TAG, "Started in onStart(), running until in onStop(): " + num);
    }
    });

注意事项

  • 思考:以下代码执行flatMap之后又创建了一个Observable在onPause方法执行的时候能正确回收么?
  • 答案:不能。正确解决方案,将compose放到faltMap后面即可,展开Top2注释,注视Top1
  • 记住:一个Observable设置一个compose一定没有问题。即top1 设置前者,top2设置后者
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Observable.just("hello world!")
//top1
.compose(this.<String>bindUntilEvent(ActivityEvent.PAUSE))
.flatMap(new Func1<String, Observable<Long>>() {
@Override
public Observable<Long> call(String s) {
return Observable.interval(1, TimeUnit.SECONDS);
}
})
//....here
//Top2 .compose(this.<Long>bindUntilEvent(ActivityEvent.PAUSE))
.subscribe(new Action1<Long>() {
@Override
public void call(Long aLong) {
Log.i(TAG, "....oh,oh,no!!..........." + aLong);
}
});

使用语法

在compose方法中通过以下两种方式设置制定生命周期

  • RxLifecycle.bind(lifecycle))
  • RxLifecycle.bindUntilEvent(lifecycle, ActivityEvent.DESTROY)

语法很简单,若要深究原理,详细可查询官方源码