1.使用,继承BaseActivity在onCreate方法中模拟了一个异步任务如下:
//测试每一秒钟在子线程发射一条数据给观察者,直到触发了activitylifeevent.ondestroy事件,自动释放
Flowable.interval(1, TimeUnit.SECONDS)
.compose(AutoLife.mInstance.format(AutoLife.ActivityLifeEvent.onDestroy))
.subscribe(new Consumer<Long>() {
@Override
public void accept(Long aLong) throws Exception {
System.out.println(aLong);
}
});
2.实现步骤如下,全部加了注释,
讲一下思路:
1.创建生命周期事件对应activity的各个生命周期
2.创建publishsubject对象,rxjava2中的一个类,既可以用作观察者也可以用作订阅者,用它来控制发送生命周期事件和监 听自己发送的事件。
3.利用compose和FlowableTransformer实现当观察者加载异步任务时subjectControl对象监听自己发送事件与要解除订阅时 的事件一致时结束订阅。
a.创建生命周期管理类如下:
/**
* activity生命周期控制类
*/
public class AutoLife {
//对应activity生命周期的事件
public static enum ActivityLifeEvent{
onCreate,onStart ,onResume,onPause,onStop,onDestroy
}
//用来发送或者接收事件的对象
private PublishSubject<ActivityLifeEvent> controlSubject = PublishSubject.create();
//私有化构造,不允许外界创建对象
private AutoLife(){
}
//暴露给外界使用的唯一对象
public static AutoLife mInstance = new AutoLife();
public PublishSubject<ActivityLifeEvent> getControlSubject() {
return controlSubject;
}
//控制生命周期函数
private FlowableTransformer unBind(ActivityLifeEvent finalEvent){
return new FlowableTransformer() {
@Override
public Publisher apply(Flowable flowable) {
return flowable.takeUntil(controlSubject.filter(new Predicate<ActivityLifeEvent>() {
@Override
public boolean test(ActivityLifeEvent event) throws Exception {
return event==finalEvent;
}
}).toFlowable(BackpressureStrategy.BUFFER));
}
};
}
//android通用的控制函数,特殊情况下可以使用unBind函数
public <T>FlowableTransformer<T,T> format(ActivityLifeEvent finalEvent){
return new FlowableTransformer<T,T>() {
@Override
public Publisher<T> apply(Flowable<T> flowable) {
return flowable.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.compose(unBind(finalEvent));
}
};
}
3.创建BaseActivity activity与AutoLife中的ActivittyLifeEvent绑定生命周期
public class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AutoLife.mInstance.getControlSubject().onNext(AutoLife.ActivityLifeEvent.onCreate);
}
@Override
protected void onStart() {
super.onStart();
AutoLife.mInstance.getControlSubject().onNext(AutoLife.ActivityLifeEvent.onStart);
}
@Override
protected void onResume() {
super.onResume();
AutoLife.mInstance.getControlSubject().onNext(AutoLife.ActivityLifeEvent.onResume);
}
@Override
protected void onPause() {
super.onPause();
AutoLife.mInstance.getControlSubject().onNext(AutoLife.ActivityLifeEvent.onPause);
}
@Override
protected void onStop() {
super.onStop();
AutoLife.mInstance.getControlSubject().onNext(AutoLife.ActivityLifeEvent.onStop);
}
@Override
protected void onDestroy() {
super.onDestroy();
AutoLife.mInstance.getControlSubject().onNext(AutoLife.ActivityLifeEvent.onDestroy);
}
}