android Observable.interval定时执行快速上手和分析

Observable.interval可以执行定时任务, Observable.interval是来源于Rxjava2的函数,我引用的是:

 compile 'io.reactivex.rxjava2:rxjava:2.2.6'

使用如下:

import java.util.concurrent.TimeUnit;
 
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Consumer;
import io.reactivex.schedulers.Schedulers;
 
private Disposable disposable;
 
/**
 * 开始定时执行
 */
private void startTimer() {
    stopTimer();
    // 每隔200毫秒执行一次逻辑代码
    disposable = Observable.interval(200, TimeUnit.MILLISECONDS)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Consumer<Long>() {
                @Override
                public void accept(@io.reactivex.annotations.NonNull Long aLong) throws Exception {
                    // 逻辑代码
                }
            }, new Consumer<Throwable>() {
                @Override
                public void accept(@io.reactivex.annotations.NonNull Throwable throwable) throws Exception {
                    throwable.printStackTrace();
                }
            });
}
 
/**
 * 停止定时执行
 */
protected void stopTimer() {
    if (null != disposable) {
        disposable.dispose();
        disposable = null;
    }
}

分析:
1、上面使用中的Observable.interval(200, TimeUnit.MILLISECONDS)的参数的第二个,可以选择不同的时间类型,可以选秒,分钟,小时等,见源码:

 SECONDS {
        public long toNanos(long d)   { return x(d, C3/C0, MAX/(C3/C0)); }
        public long toMicros(long d)  { return x(d, C3/C1, MAX/(C3/C1)); }
        public long toMillis(long d)  { return x(d, C3/C2, MAX/(C3/C2)); }
        public long toSeconds(long d) { return d; }
        public long toMinutes(long d) { return d/(C4/C3); }
        public long toHours(long d)   { return d/(C5/C3); }
        public long toDays(long d)    { return d/(C6/C3); }
        public long convert(long d, TimeUnit u) { return u.toSeconds(d); }
        int excessNanos(long d, long m) { return 0; }
    },

2、interval重写了四个函数,如下:

/**
 * @param period 每次执行的间隔的时间
 * @param unit 时间单位
 * @return Observable对象
 */
 
  @CheckReturnValue
    @SchedulerSupport(SchedulerSupport.COMPUTATION)
    public static Observable<Long> interval(long period, TimeUnit unit) {
        return interval(period, period, unit, Schedulers.computation());
    }
/**
 * @param initialDelay 第一次执行的延迟时间
 * @param period 每次执行的间隔的时间
 * @param unit 时间单位
 * @return Observable对象
 */
  @CheckReturnValue
    @SchedulerSupport(SchedulerSupport.COMPUTATION)
    public static Observable<Long> interval(long initialDelay, long period, TimeUnit unit) {
        return interval(initialDelay, period, unit, Schedulers.computation());
    }
   /**
 * @param period 每次执行的间隔的时间
 * @param unit 时间单位
 * @param scheduler 线程调度器
 * @return Observable对象
 */

  @CheckReturnValue
    @SchedulerSupport(SchedulerSupport.CUSTOM)
    public static Observable<Long> interval(long period, TimeUnit unit, Scheduler scheduler) {
        return interval(period, period, unit, scheduler);
    }
/**
 * @param initialDelay 第一次执行的延迟时间
 * @param period 每次执行的间隔的时间
 * @param unit 时间单位
 * @param scheduler 线程调度器
 * @return Observable对象
 */
   @CheckReturnValue
    @NonNull
    @SchedulerSupport(SchedulerSupport.CUSTOM)
    public static Observable<Long> interval(long initialDelay, long period, TimeUnit unit, Scheduler scheduler) {
        ObjectHelper.requireNonNull(unit, "unit is null");
        ObjectHelper.requireNonNull(scheduler, "scheduler is null");

        return RxJavaPlugins.onAssembly(new ObservableInterval(Math.max(0L, initialDelay), Math.max(0L, period), unit, scheduler));
    }

3、Scheduler 线程调度器是干啥的?

见文章:https://blog.csdn.net/suyimin2010/article/details/92532527

需要规定次数

private var disposable: Disposable? = null

private fun startQuery() {
stopTimer();
disposable = Observable.intervalRange(1, 3, 500, 300, TimeUnit.MILLISECONDS)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
authQuery(systemId, businessOrderCode, orderCode)
}
) { throwable -> throwable.printStackTrace() }
}

/**
 * 停止定时执行
 */
private fun stopTimer() {
    if (null != disposable) {
        disposable?.dispose()
        disposable = null
    }
}

https://blog.csdn.net/u013750244/article/details/104668904

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值