最近在公司没有开发任务,就完整过了一下ReactiveX的rxjava,在考虑使用场景时,就考虑到异步操作可能会造成泄露问题,所以网上搜索就发现relifecycle这个辅助库。下面就记录一下它的使用和实现原理
需要在build.gradle中配置:
implementation 'com.trello.rxlifecycle2:rxlifecycle:2.2.0'
implementation 'com.trello.rxlifecycle2:rxlifecycle-android:2.2.0'
implementation 'com.trello.rxlifecycle2:rxlifecycle-components:2.2.0'
基础使用:
public class MainActivity extends RxAppCompatActivity {
String TAG = "tag";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> emitter) throws Exception {
emitter.onNext("text");
}
}).subscribeOn(Schedulers.io()).compose(this.<String>bindUntilEvent(ActivityEvent.PAUSE)).subscribe(new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
Log.d(TAG, "onSubscribe: ");
}
@Override
public void onNext(String s) {
Log.d(TAG, "onNext: " + s);
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
@Override
public void onComplete() {
}
});
}
}
在rxjava的基础上只要修改两处即可能实现接入:
1、对应继承的Activity、Fragment更换为继承RxActivity和RxFragment,在辅助库还适配其他类型。
2、绑定对应的生命周期监听
relifecycler有两种绑定监听的形式:
public interface LifecycleProvider<E> {
/**
* 返回一系列生命周期事件
*/
@Nonnull
@CheckReturnValue
Observable<E> lifecycle();
/**
* 1、当发生某个特定事件时断开监听,由我们自己指定
*
* @param 枚举类ActivityEvent
* @reture 一个可重复使用的LifecycleTransformer
*/
@Nonnull
@CheckReturnValue
<T> LifecycleTransformer<T> bindUntilEvent(@Nonnull E event);
/**
* 2、绑定源,直到发生下一个合理事件,自动指定
* @return 一个可重复使用的LifecycleTransformer
*/
@Nonnull
@CheckReturnValue
<T> LifecycleTransformer<T> bindToLifecycle();
}
第二种自动指定规则的代码块如下:
private static final Function<ActivityEvent, ActivityEvent> ACTIVITY_LIFECYCLE =
new Function<ActivityEvent, ActivityEvent>() {
@Override
public ActivityEvent apply(ActivityEvent lastEvent) throws Exception {
switch (lastEvent) {
case CREATE: // 在onCreate方法中,和下一个方法出现之前的注册监听
return ActivityEvent.DESTROY;
case START: // 在onStart方法中,和下一个方法出现之前的注册监听
return ActivityEvent.STOP;
case RESUME: // 在onResume方法中,和下一个方法出现之前的注册监听
return ActivityEvent.PAUSE;
case PAUSE: // 在onPause方法中,和下一个方法出现之前的注册监听
return ActivityEvent.STOP;
case STOP: // 在onStop方法中,和下一个方法出现之前的注册监听
return ActivityEvent.DESTROY;
case DESTROY:
throw new OutsideLifecycleException("Cannot bind to Activity lifecycle when outside of it.");
default:
throw new UnsupportedOperationException("Binding to " + lastEvent + " not yet implemented");
}
}
};
rxlofecycler的使用挺简单的,其实原理也是十分简单,其实这是利用Rxjava的takeUntil关键字
takeUtil关键字作用:TakeUntil订阅并开始镜像源Observable。 它还监视您提供的第二个Observable。 如果第二个Observable发出一个项目或发送终止通知,则TakeUntil返回的Observable将停止镜像源Observable并终止。这第二个Observable就是维护在RxActivity中。
我写了一个例子,模拟了bindUntilEvent的功能实现
// 第二个Observable(即RxActivityz中维护的Observable)
final BehaviorSubject<String> behaviorSubject = BehaviorSubject.create();
behaviorSubject.filter(new Predicate<String>() {
@Override
public boolean test(String s) throws Exception {
return "end".equals(s);
}
}).subscribe(new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String s) {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
// 第一个Observable(即我们自己的Observable)
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> emitter) throws Exception {
while (true) {
emitter.onNext("aa");
}
}
}).subscribeOn(Schedulers.io()).compose(new ObservableTransformer<String, String>() {
@Override
public ObservableSource<String> apply(Observable<String> upstream) {
return upstream.takeUntil(behaviorSubject);
}
}).subscribe(new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
Log.d(TAG, "onSubscribe: ");
}
@Override
public void onNext(String s) {
Log.d(TAG, "onNext: " + s);
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
@Override
public void onComplete() {
}
});
// 一秒钟后第二个Observable发出特定事件(“end”),第一个Observable中止取消监听
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
behaviorSubject.onNext("end");
}
}, 1000);
}
rxlifecycler的源码挺少,也挺容易看的,可以通过上面这个例子对照源码进行分析就可以很容易明白rxlifecycler的实现,不过最好不要在BaseActivity中直接继承RxActivity,这样不管在使不使用Rxjava的情况,每个Activity都会有一个Observable的存在,这点需要斟酌一下。