RxJava2.x实现定时器的实例代码
前言
由于现在网络层已经升级到RxJava2.x相关的了,所以需要做些调整。虽然RxJava1.x和RxJava2.x同属RxJava系列,但由于RxJava2.x部分代码的重写,导致RxJava2.x与RxJava1.x已是两个不同的版本,RxJava2.x在性能上更优,尤其在背压支持上。当然,此篇重点不在Rx版本上的区别,有兴趣的同学可以自行研究。当然,2.x之于1.x的区别之一是2.x中已经没有SubscriptionmSubscription,Observable.create()等方法也不再返回Subscription对像,取而代之的是在newObserver()方法中会多返回一个
onSubscribe(@NonNullDisposabledisposable)方法,而Disposabledisposable即时我们取消订阅要用到的对象,其方法有:
packageio.reactivex.disposables; /** *Representsadisposableresource. */ publicinterfaceDisposable{ /** *Disposetheresource,theoperationshouldbeidempotent. */ voiddispose(); /** *Returnstrueifthisresourcehasbeendisposed. *@returntrueifthisresourcehasbeendisposed */ booleanisDisposed(); }
dispose():取消订阅
isDisposed():判断订阅是否已经取消
ok,有了这些铺垫之后,我们进入正题。
第一步,导入RxJava2.x依赖包
//rxjava2.x compile'io.reactivex.rxjava2:rxandroid:2.0.1' compile'io.reactivex.rxjava2:rxjava:2.1.0'
第二步,直接上定时器类RxTimerUtil代码
/** *Instruction:Rxjava2.x实现定时器 **Author:pei *Date:2017/6/29 *Description: */ publicclassRxTimerUtil{ privatestaticDisposablemDisposable; /**milliseconds毫秒后执行next操作 * *@parammilliseconds *@paramnext */ publicstaticvoidtimer(longmilliseconds,finalIRxNextnext){ Observable.timer(milliseconds,TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread()) .subscribe(newObserver
(){ @Override publicvoidonSubscribe(@NonNullDisposabledisposable){ mDisposable=disposable; } @Override publicvoidonNext(@NonNullLongnumber){ if(next!=null){ next.doNext(number); } } @Override publicvoidonError(@NonNullThrowablee){ //取消订阅 cancel(); } @Override publicvoidonComplete(){ //取消订阅 cancel(); } }); } /**每隔milliseconds毫秒后执行next操作 * *@parammilliseconds *@paramnext */ publicstaticvoidinterval(longmilliseconds,finalIRxNextnext){ Observable.interval(milliseconds,TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread()) .subscribe(newObserver (){ @Override publicvoidonSubscribe(@NonNullDisposabledisposable){ mDisposable=disposable; } @Override publicvoidonNext(@NonNullLongnumber){ if(next!=null){ next.doNext(number); } } @Override publicvoidonError(@NonNullThrowablee){ } @Override publicvoidonComplete(){ } }); } /** *取消订阅 */ publicstaticvoidcancel(){ if(mDisposable!=null&&!mDisposable.isDisposed()){ mDisposable.dispose(); LogUtil.e("====定时器取消======"); } } publicinterfaceIRxNext{ voiddoNext(longnumber); } }
需要注意的是,若你使用的是延时执行一次的话,在调用timer后,不需要cancel,因为我在代码中已经处理好了,
如果是调用的重复执行的方法,你需要在activity的ondestroy方法中取消订阅,类似如下:
@Override protectedvoidonDestroy(){ //取消定时器 RxTimerUtil.cancel(); LogUtil.e("====cancel====="+DateUtil.getNowTime()); super.onDestroy(); }
多么简单粗暴,好了,今天就讲到这里吧,希望对大家的学习有所帮助,也希望大家多多支持毛票票。