How to stop and resume Observable.interval emiting ticks

后端 未结 7 2012
野性不改
野性不改 2020-12-13 06:32

This will emit a tick every 5 seconds.

Observable.interval(5, TimeUnit.SECONDS, Schedulers.io())
            .subscribe(tick -> Log.d(TAG, "tick = &qu         


        
相关标签:
7条回答
  • 2020-12-13 07:33

    Here is a another way to do this, I think.
    When you check the source code, you will find interval() using class OnSubscribeTimerPeriodically. The key code below.

    @Override
    public void call(final Subscriber<? super Long> child) {
        final Worker worker = scheduler.createWorker();
        child.add(worker);
        worker.schedulePeriodically(new Action0() {
            long counter;
            @Override
            public void call() {
                try {
                    child.onNext(counter++);
                } catch (Throwable e) {
                    try {
                        worker.unsubscribe();
                    } finally {
                        Exceptions.throwOrReport(e, child);
                    }
                }
            }
    
        }, initialDelay, period, unit);
    }
    

    So, you will see, if you wanna cannel the loop, what about throwing a new exception in onNext(). Example code below.

    Observable.interval(1000, TimeUnit.MILLISECONDS)
                .subscribe(new Action1<Long>() {
                    @Override
                    public void call(Long aLong) {
                        Log.i("abc", "onNext");
                        if (aLong == 5) throw new NullPointerException();
                    }
                }, new Action1<Throwable>() {
                    @Override
                    public void call(Throwable throwable) {
                        Log.i("abc", "onError");
                    }
                }, new Action0() {
                    @Override
                    public void call() {
                        Log.i("abc", "onCompleted");
                    }
                });
    

    Then you will see this:

    08-08 11:10:46.008 28146-28181/net.bingyan.test I/abc: onNext
    08-08 11:10:47.008 28146-28181/net.bingyan.test I/abc: onNext
    08-08 11:10:48.008 28146-28181/net.bingyan.test I/abc: onNext
    08-08 11:10:49.008 28146-28181/net.bingyan.test I/abc: onNext
    08-08 11:10:50.008 28146-28181/net.bingyan.test I/abc: onNext
    08-08 11:10:51.008 28146-28181/net.bingyan.test I/abc: onNext
    08-08 11:10:51.018 28146-28181/net.bingyan.test I/abc: onError             
    
    0 讨论(0)
提交回复
热议问题