您的位置:首页 > 编程语言 > Java开发

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

2017-09-06 11:59 211 查看

前言:

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

需求描述:

使用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的朋友一起提升,谢谢了.





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐