1.引入Rxjava
implementation 'io.reactivex.rxjava2:rxjava:2.0.1'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
2.Timer实现
public class SimpleTimer {
private TextView mTimeTv;
private long playRecordTime;
private long answerTime = 10 * 60;
private Disposable mDDisposable;
public static final SimpleDateFormat sdf = new SimpleDateFormat(
"mm:ss", Locale.SIMPLIFIED_CHINESE);
public SimpleTimer(TextView mTimeTv) {
this.mTimeTv = mTimeTv;
}
public SimpleTimer(TextView mTimeTv, long time) {
this.mTimeTv = mTimeTv;
this.answerTime = time;
}
public void start() {
//避免重复开启倒计时
if (mDDisposable != null && !mDDisposable.isDisposed()) {
return;
}
//第一个参数 序列的起点
//第二个参数 事件的数量
//第三个参数 首次事件延迟发送的事件
//第四个参数 事件发送间隔时间
//第五个参数 时间单位
Observable.intervalRange(playRecordTime, answerTime + 1, 0, 1, TimeUnit.SECONDS)
.subscribeOn(Schedulers.io()) //在子线程在执行计时
.observeOn(AndroidSchedulers.mainThread()) //在主线程上更新UI
.subscribe(new Observer<Long>() {
@Override
public void onSubscribe(Disposable d) {
mDDisposable = d;
Log.d("HGG", "onSubscribe");
}
@Override
public void onNext(Long value) {
//记录当前计时数
playRecordTime = value;
String format = sdf.format(new Date((answerTime - playRecordTime) * 1000));
mTimeTv.setText(format);
Log.d("HGG", "onNext:" + value);
}
@Override
public void onError(Throwable e) {
Log.d("HGG", "onError");
}
@Override
public void onComplete() {
Log.d("HGG", "onComplete");
}
});
}
public void pause() {
if (mDDisposable != null) {
mDDisposable.dispose();
}
}
public void stop() {
if (mDDisposable != null) {
String format = sdf.format(new Date((answerTime) * 1000));
mTimeTv.setText(format);
playRecordTime = 0;
mDDisposable.dispose();
mDDisposable = null;
}
}
}