HighlanderxJava2 实战类别作品

路虎极光xJava2 实战知识梳理(1) – 后台执行耗费时间操作,实时通报 UI
更新

智跑xJava2 实战知识梳理(2) –
计算一段时间内数据的平均值

KugaxJava2 实战知识梳理(3) –
优化搜索联想效率

CRUISERxJava2 实战知识梳理(4) – 结合 Retrofit
请求新闻资讯

驭胜xJava2 实战知识梳理(5) –
简单及进阶的轮询操作

昂科威xJava2 实战知识梳理(6) –
基于错误类型的重试请求

ENCORExJava2 实战知识梳理(7) – 基于 combineLatest
达成的输入表单验证

TiguanxJava2 实战知识梳理(8) – 使用 publish + merge
优化先加载缓存,再读取网络数据的请求进度

中华VxJava2 实战知识梳理(9) – 使用 timer/interval/delay
完结职责调度

RAV4xJava2 实战知识梳理(10) – 显示器旋转导致 Activity
重建时上涨职务

奥迪Q7xJava2 实战知识梳理(11) –
检查和测试互联网状态并自行重试请求

中华VxJava2 实战知识梳理(12) – 实战讲解 publish & replay & share & refCount
& autoConnect

陆风X8xJava2 实战知识梳理(13) –
怎样使得错误爆发时不自行结束订阅关系

奥迪Q5xJava2 实战知识梳理(14) – 在 token 过期时,刷新过期 token
并再一次发起呼吁

CRUISERxJava2 实战知识梳理(15) – 达成一个简易的 MVP + RubiconxJava + Retrofit
应用


一、前言

实质上在前边的篇章中,我们早已接触过定时/周期执行任务的操作符,例如在
中华VxJava2 实战知识梳理(5) –
不难及进阶的轮询操作

翼虎xJava2 实战知识梳理(6) –
基于错误类型的重试请求

那两篇小说当中,大家经过intervalRange兑现了轮询工作,通过timer落到实处了延时的重试请求。

明日那篇小说,大家依照
RxJava-Android-Samples
中总括的二种现象来复习一下方可兑现定时调度职分的操作符:

  • timer:创立型操作符,用于延时执行职分。
  • interval:创建型操作符,用于周期执行职务。
  • delay:协理型操作,用于延时传递数据。

二、timer

2.1 timer 操作符原理

timer规律图如下所示:

timer 原理图

非常粗大略,在订阅之后,它会在伺机一段时间之后发出三个0数量项,然后结束,因而它常常能够用来延时地发送时间,例如
LANDxJava2 实战知识梳理(5) –
简单及进阶的轮询操作

中,大家应用repeatWhen提倡重订阅时,便是经过timer兑现了延时发送onNext时间来落到实处时延变长的轮询操作。

2.2 使用 timer 延时 1s 后进行任务,然后截止

我们采用timer操作符实现下边包车型地铁机能:延时1s后在子线程执行义务,接着达成,那里大家采用了timer,并通过subscribe方法让下游运营在子线程其中。

    //延迟 1s 后执行一个任务,然后结束
    private void startTimeDemo1() {
        Log.d(TAG, "startTimeDemo1");
        DisposableObserver<Long> disposableObserver = getTimeDemoObserver();
        Observable.timer(1000, TimeUnit.MILLISECONDS).subscribeOn(Schedulers.io()).subscribe(disposableObserver);
        mCompositeDisposable.add(disposableObserver);
    }

运营结果为:

三、interval

3.1 interval 原理

interval的原理图如下所示:

interval 原理图

interval也是一个创制型操作符,它可以间隔一段时间就发送1个数码。

3.2 每隔 1s 执行一回职分,首回职务履行前有 1s 的间隔,执行无限次

咱俩先使用interval贯彻下边这么些职能:每隔1s施行一遍任务,第3次职责执行前有1s的区间,执行无限次。这是因为,使用interval操作符时,暗中认可第三回个职责急需延时和内定间隔相同的大运。

    //每隔 1s 执行一次任务,第一次任务执行前有 1s 的间隔,执行无限次
    private void startTimeDemo2() {
        Log.d(TAG, "startTimeDemo2");
        DisposableObserver<Long> disposableObserver = getTimeDemoObserver();
        Observable.interval(1000, TimeUnit.MILLISECONDS).subscribeOn(Schedulers.io()).subscribe(disposableObserver);
        mCompositeDisposable.add(disposableObserver);
    }

运作结果如下所示:

3.3 每隔 1s 执行三遍任务,立刻执行第二回职分,执行无限次

假使期望马上执行第①回职分,那么能够给它提供额外的参数,钦命第3回职务的延时:

    //每隔 1s 执行一次任务,立即执行第一次任务,执行无限次
    private void startTimeDemo3() {
        Log.d(TAG, "startTimeDemo3");
        DisposableObserver<Long> disposableObserver = getTimeDemoObserver();
        Observable.interval(0, 1000, TimeUnit.MILLISECONDS).subscribeOn(Schedulers.io()).subscribe(disposableObserver);
        mCompositeDisposable.add(disposableObserver);
    }

运转结果为:

3.4 每隔 1s 执行2回职分,立时实施第①遍职务,只进行七次

3.3的例证中,我们的职务会极其执行下去,假如大家盼望只进行钦命次数该怎么做呢,其实在
奇骏xJava2 实战知识梳理(5) –
不难及进阶的轮询操作

中示范固定时延的轮询操作时,大家已经介绍了接纳intervalRange来促成,今天,大家选用interval + take的艺术来兑现,代码如下:

    //每隔 1s 执行一次任务,立即执行第一次任务,只执行五次
    private void startTimeDemo4() {
        Log.d(TAG, "startTimeDemo4");
        DisposableObserver<Long> disposableObserver = getTimeDemoObserver();
        Observable.interval(0, 1000, TimeUnit.MILLISECONDS).take(5).subscribe(disposableObserver);
        mCompositeDisposable.add(disposableObserver);
    }

运营结果为:

take的原理图如下所示:

take 操作符

它意味着我们只接受前n个数据项,那样和interval重组就足以兑现稳定间隔与稳定次数的职责履行。

四、delay

4.1 delay 原理

delay的原理图如下所示:

当它接受一个刻钟段时,每当原始的Observable发射了叁个数码项时,它就开动一个定时器,等待钦赐的大运后再将这一个数额发射出去,由此表现为发出的多少项实行了移动,但是它只会移动onNext/onComplete,对于onError,它会立时发出出去,并且舍弃在此以前等待发射的onNext事件。

4.2 先实施一个任务,等待 1s,再进行另二个职务,然后结束

因为delay不是创立型操作符,所以大家能够用来推延上游发射过来的多少,上面,让大家贯彻那一个效应:先实施三个义务,等待
1s,再实践另3个职务,然后停止。代码如下:

    //先执行一个任务,等待 1s,再执行另一个任务,然后结束
    private void startTimeDemo5() {
        Log.d(TAG, "startTimeDemo5");
        DisposableObserver<Long> disposableObserver = getTimeDemoObserver();
        Observable.just(0L).doOnNext(new Consumer<Long>() {

            @Override
            public void accept(Long aLong) throws Exception {
                Log.d(TAG, "执行第一个任务");
            }

        }).delay(1000, TimeUnit.MILLISECONDS).subscribe(disposableObserver);
        mCompositeDisposable.add(disposableObserver);
    }

履行效果为:


更加多文章,欢迎访问笔者的 Android 知识梳理体系:

网站地图xml地图