Android中实现定时器的方法有很多,大致有以下几种:
1.Thread +handler
2.handler的postdelay
3.timer
4.AlarmManager
关于 AlarmManager 的使用,大家可以看看我的另一篇文章:
寒炽-----AlarmManager为定时而生的绝杀技能:http://blog.youkuaiyun.com/burn_yourself/article/details/52574131
那么今天我们就来讲讲 RxJava1.x 是怎么优雅的实现定时器相关功能的,本篇文章参考了以下链接,有兴趣的同学可以去看看,
里面涉及到RxJava1.x的大量总结,还是能让人获益匪浅的。链接如下:
http://www.jianshu.com/p/6917510b0e4c
在此以做感谢。好了,那么今天就来讲讲 RxJava 是怎么实现定时器功能的。
首先,引入依赖库是必须的:
//rxjava
compile 'io.reactivex:rxjava:1.2.7'//rx对Android的支持
compile 'io.reactivex:rxandroid:1.2.1'//rxjava
然后,看代码的实现。Speaking is so cheap,show me the code!
package com.test.util;
import java.util.concurrent.TimeUnit;
import rx.Observable;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
/**
* Created by Admin on 2017/5/17.
*
* Rxjava定时器
* //rxjava
* compile 'io.reactivex:rxjava:1.2.7'//rx对Android的支持
* compile 'io.reactivex:rxandroid:1.2.1'//rxjava
*/
public class RxTimerUtil {
private static Subscription mSubscription;
/** milliseconds毫秒后执行next操作
*
* @param milliseconds
* @param next
*/
public static void timer(long milliseconds,final IRxNext next) {
mSubscription = Observable.timer(milliseconds, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Long>() {
@Override
public void call(Long number) {
if(next!=null){
next.doNext(number);
}
//取消订阅
cancel();
}
});
}
/** 每隔milliseconds毫秒后执行next操作
*
* @param milliseconds
* @param next
*/
public static void interval(long milliseconds,final IRxNext next){
mSubscription=Observable.interval(milliseconds, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Long>() {
@Override
public void call(Long number) {
if(next!=null){
next.doNext(number);
}
}
});
}
/**
* 取消订阅
*/
public static void cancel(){
if(mSubscription!=null&&!mSubscription.isUnsubscribed()){
mSubscription.unsubscribe();
}
}
public interface IRxNext{
void doNext(long number);
}
}
需要注意的是,若你使用的是延时执行一次的话,在调用 timer 后,不需要 cancel,因为我在代码中已经处理好了,
如果是调用的重复执行的方法,你需要在activity的ondestroy方法中取消订阅,类似如下:
@Override
protected void onDestroy(){
RxTimerUtil.cancel();
LogUtil.e("====cancel====="+ DateUtil.getNowTime());
super.onDestroy();
}
OK。今天的讲解就到这里,谢谢诶!