0
点赞
收藏
分享

微信扫一扫

利用RxJava实现超级简单的定时器(RxTimer)

大自然在召唤 2022-02-27 阅读 37


背景:

    在项目中经常会有需要做定时任务的地方,以前一般采用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

关于我

厦门大学计算机专业 | 前华为工程师

分享编程技术,没啥深度,但看得懂,适合初学者。

Java | 安卓 | 前端 | 小程序 | 鸿蒙

公众号:花生皮编程

利用RxJava实现超级简单的定时器(RxTimer)_android



举报

相关推荐

0 条评论