rxjava2打造自己的異步任務的生命週期管理---activity中的簡單實現

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章