背景:
在项目中经常会有需要做定时任务的地方,以前一般采用Timer或者ScheduledExecutorService
解决方案:
1)项目中引入依赖:
implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
implementation 'io.reactivex.rxjava2:rxjava:2.2.2'
2)增加如下工具类:
package com.cxyzy.rxtimer;
import android.support.annotation.NonNull;
import java.util.concurrent.TimeUnit;
import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
public class RxTimer {
private Disposable mDisposable;
/**
* milliseconds毫秒后执行指定动作
*
* @param milliSeconds
* @param rxAction
*/
public void timer(long milliSeconds, final RxAction rxAction) {
Observable.timer(milliSeconds, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Long>() {
@Override
public void onSubscribe(@NonNull Disposable disposable) {
mDisposable = disposable;
}
@Override
public void onNext(@NonNull Long number) {
if (rxAction != null) {
rxAction.action(number);
}
}
@Override
public void onError(@NonNull Throwable e) {
//取消订阅
cancel();
}
@Override
public void onComplete() {
//取消订阅
cancel();
}
});
}
/**
* 每隔milliseconds毫秒后执行指定动作
*
* @param milliSeconds
* @param rxAction
*/
public void interval(long milliSeconds, final RxAction rxAction) {
Observable.interval(milliSeconds, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Long>() {
@Override
public void onSubscribe(@NonNull Disposable disposable) {
mDisposable = disposable;
}
@Override
public void onNext(@NonNull Long number) {
if (rxAction != null) {
rxAction.action(number);
}
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
}
});
}
/**
* 取消订阅
*/
public void cancel() {
if (mDisposable != null && !mDisposable.isDisposed()) {
mDisposable.dispose();
}
}
public interface RxAction {
/**
* 让调用者指定指定动作
*
* @param number
*/
void action(long number);
}
}
调用样例:
RxTimer rxTimer = new RxTimer();
rxTimer.timer(1000, number -> Toast.makeText(MainActivity.this, "延迟1秒显示的toast", Toast.LENGTH_SHORT).show());
如果是调用的interval方法,需要在activity的onDestroy方法中调用cancel,类似如下:
@Override
protected void onDestroy(){
rxTimer.cancel();
super.onDestroy();
}
附录:
1. 源代码及样例工程(含apk及屏幕截图):https://gitee.com/cxyzy1/RxTimer
安卓开发技术分享: https://www.jianshu.com/p/442339952f26
![](https://img.haomeiwen.com/i6169789/c56af117f2c1d072.jpg)
网友评论