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);
}
}