使用Rxjava完成倒计时遇到的问题及处理

来源:互联网 发布:亚马逊aws 知乎 编辑:程序博客网 时间:2024/05/29 16:00

前言:

很久没有写博客了,技术并没有太大的提升,就最近项目遇到的问题做一个简单的问题解决叙述,写的垃圾还请见谅.


需求描述:

使用rxjava完成倒计时,倒计时中途(未到0秒)重置时间


出现问题:

在使用rxjava中,由于使用较少,理解不够透彻,遇到了很多不清楚的问题,今天说下我遇到的问题:
倒计时中途手动取消订阅,再次执行代码,rx代码不再执行



解决:

先看代码

   Observable<Long> observable = Observable.interval(0, 1, TimeUnit.SECONDS).take(second + 1).map(new Function<Long, Long>() {            @Override            public Long apply(@NonNull Long aLong) throws Exception {                return second - aLong;// 由于是倒计时,需要将倒计时的数字反过来            }        }).observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.newThread());        observable.subscribe(getObserver());


   private Observer getObserver() {        Observer<Long> longObserver = new Observer<Long>() {            @Override            public void onSubscribe(@NonNull Disposable d) {//                cd.add(d);                disposable = d;            }            @Override            public void onNext(@NonNull Long o) {                tvSecondNum.setText(o + "");            }            @Override            public void onError(@NonNull Throwable e) {            }            @Override            public void onComplete() {                showDialogReminder();            }        };        return longObserver;    }

最初出现问题时,我是用的匿名链式的方式写的,更改为用变量返回Observer的方式,这样就把问题解决了.在使用取消订阅时, 最初使用

private CompositeDisposable cd = new CompositeDisposable();cd.add(d)cd.dispose();



这样的方式取消订阅,但是也不能实现,然后更改为

private Disposable disposable;disposable = d;if(disposable!=null){            disposable.dispose();//取消订阅        }



改成这样就完成了要求
到这就结束了,希望能向遇到相同问题但是没有找到解决办法的朋友提供一点帮助,最后希望看到博客的大佬,能留言解释下这是什么原因造成的,让我和同样学习rxjava的朋友一起提升,谢谢了.









原创粉丝点击