Android倒计时通用封装(RxJava+Lifecycle)

1,355 阅读1分钟

以前写倒计时恐怕都是使用Timer或者Handler,后来有了RxJava后都会选择使用RxJava来操作,可是无论哪一种,都要在页面销毁的时候去做对应的处理,多个页面都用到的话代码就显得冗余,Android的Jetpack中有了lifecycle之后就可以优雅的处理这些问题了,而且从26之后AppCompatActivity以及Fragment已经默认实现了LifecycleOwner接口,我们可以直接使用getLifecycle().addObserver(LifecycleObserver observer);

涉及知识点:RxJava操作符,RxJava线程调度,Lifecycle,单例(内部类实现方式)

lifecycle的具体使用请参考官方文档:developer.android.google.cn/topic/libra…

public class CountDownManager implements LifecycleObserver {
    DisposableObserver disposableObserver;
    private CountDownManager() {
    }
    private static class Holder {
        private static final CountDownManager instance = new CountDownManager();
    }

    //高版本的UIController默认已经实现了LifecycleOwner接口,可以直接监听生命周期
    //想要使用的话必须在UIController里面使用getLifecycle().addObserver(CountDownManager.getInstance());
    // getLifecycle() UIController自带方法
    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public void destroy(){
        cacelCallback();
    }

    public static CountDownManager getInstance() {
        return Holder.instance;
    }

   

    @SuppressLint("CheckResult")
    public CountDownManager startCountDown(@NonNull int time) {
        disposableObserver = Observable.interval(1, TimeUnit.SECONDS)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .take(time)
                .map(aLong -> time - aLong)
                .subscribeWith(new DisposableObserver<Long>() {
                    @Override
                    public void onNext(Long aLong) {
                        if (callback != null)
                            callback.onNext(aLong);
                    }

                    @Override
                    public void onError(Throwable e) {
                    }

                    @Override
                    public void onComplete() {
                        if (callback != null)
                            callback.onComplete();
                    }
                });

        return this;

    }

    private callback callback;

    public void setCallback(CountDownManager.callback callback) {
        this.callback = callback;
    }

    public void cacelCallback() {
        if (null != disposableObserver && !disposableObserver.isDisposed()) {
            disposableObserver.dispose();
        }

    }

    public interface callback {
        void onNext(Long time);
        void onComplete();
    }
}

如何使用? 以Activity为例

@Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getLifecycle().addObserver(CountDownManager.getInstance());
        CountDownManager.getInstance().startCountDown(10).setCallback(new CountDownManager.callback() {
            @Override
            public void onNext(Long time) {
                // Callbacks per second,you can do something here
            }

            @Override
            public void onComplete() {
                // complete
            }
        });
    }

如果没在Activity或者Fragment中可以在适当的时机调用

CountDownManager.getInstance().cacelCallback();

想要了解更多lifecycle,请点击:developer.android.google.cn/topic/libra…