美文网首页安卓开发安卓开发
利用RxJava实现超级简单的定时器(RxTimer)

利用RxJava实现超级简单的定时器(RxTimer)

作者: 蓝不蓝编程 | 来源:发表于2018-10-12 08:41 被阅读33次

    背景:

    在项目中经常会有需要做定时任务的地方,以前一般采用Timer或者ScheduledExecutorService

    解决方案:

    1)项目中引入依赖:

        implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
        implementation 'io.reactivex.rxjava2:rxjava:2.2.2'
    

    2)增加如下工具类:

    package com.cxyzy.rxtimer;
    
    import android.support.annotation.NonNull;
    
    import java.util.concurrent.TimeUnit;
    
    import io.reactivex.Observable;
    import io.reactivex.Observer;
    import io.reactivex.android.schedulers.AndroidSchedulers;
    import io.reactivex.disposables.Disposable;
    
    public class RxTimer {
    
        private Disposable mDisposable;
    
        /**
         * milliseconds毫秒后执行指定动作
         *
         * @param milliSeconds
         * @param rxAction
         */
        public void timer(long milliSeconds, final RxAction rxAction) {
            Observable.timer(milliSeconds, TimeUnit.MILLISECONDS)
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Observer<Long>() {
                        @Override
                        public void onSubscribe(@NonNull Disposable disposable) {
                            mDisposable = disposable;
                        }
    
                        @Override
                        public void onNext(@NonNull Long number) {
                            if (rxAction != null) {
                                rxAction.action(number);
                            }
                        }
    
                        @Override
                        public void onError(@NonNull Throwable e) {
                            //取消订阅
                            cancel();
                        }
    
                        @Override
                        public void onComplete() {
                            //取消订阅
                            cancel();
                        }
                    });
        }
    
        /**
         * 每隔milliseconds毫秒后执行指定动作
         *
         * @param milliSeconds
         * @param rxAction
         */
        public void interval(long milliSeconds, final RxAction rxAction) {
            Observable.interval(milliSeconds, TimeUnit.MILLISECONDS)
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Observer<Long>() {
                        @Override
                        public void onSubscribe(@NonNull Disposable disposable) {
                            mDisposable = disposable;
                        }
    
                        @Override
                        public void onNext(@NonNull Long number) {
                            if (rxAction != null) {
                                rxAction.action(number);
                            }
                        }
    
                        @Override
                        public void onError(@NonNull Throwable e) {
    
                        }
    
                        @Override
                        public void onComplete() {
    
                        }
                    });
        }
    
        /**
         * 取消订阅
         */
        public void cancel() {
            if (mDisposable != null && !mDisposable.isDisposed()) {
                mDisposable.dispose();
            }
        }
    
        public interface RxAction {
            /**
             * 让调用者指定指定动作
             *
             * @param number
             */
            void action(long number);
        }
    }
    

    调用样例:

    RxTimer rxTimer = new RxTimer();
    rxTimer.timer(1000, number -> Toast.makeText(MainActivity.this, "延迟1秒显示的toast", Toast.LENGTH_SHORT).show());
    

    如果是调用的interval方法,需要在activity的onDestroy方法中调用cancel,类似如下:

    @Override
    protected void onDestroy(){
        rxTimer.cancel();
        super.onDestroy();
    }
    

    附录:

    1. 源代码及样例工程(含apk及屏幕截图):https://gitee.com/cxyzy1/RxTimer

    安卓开发技术分享: https://www.jianshu.com/p/442339952f26

    相关文章

      网友评论

        本文标题:利用RxJava实现超级简单的定时器(RxTimer)

        本文链接:https://www.haomeiwen.com/subject/jxrwaftx.html