现在很多软件都需要获取短信验证码,通常都是60秒在向服务器发送一次请求。那么如果用Rxjava来实现这个倒计时的功能呢?
用到的操作符如下:
1.interval:
创建一个按照给定的时间间隔发射从0开始的整数序列的Observable<Long>,内部通过OnSubscribeTimerPeriodically工作。
Observable.interval(1,TimeUnit.SECONDS) .subscribe(new Consumer<Long>() { @Override public void accept(Long aLong) throws Exception { //每隔1秒发送数据项,从0开始计数 //0,1,2,3.... } });
2.take
take: 只发射开始的N项数据或者一定时间内的数据。内部通过OperatorTake和OperatorTakeTimed过滤数据
Observable.just(1,2,3,4) .take(3)//发射前三个数据项 .take(100, TimeUnit.MILLISECONDS);//发射100ms内的数据
3.map
对Observable发射的每一项数据都应用一个函数来变换。
Observable.just(6,2,3,4,5) .map(new Function<Integer, String>() { @Override public String apply(Integer integer) throws Exception { return 1+""; } })
正式代码如下
@OnClick(R.id.button)
public void onViewClicked() {
ToastUtils.showToast("哈士奇爱吃苹果");
final int count = 10;//倒计时10秒
Observable.interval(0, 1, TimeUnit.SECONDS)
.take(count + 1)
.map(new Function<Long, Long>() {
@Override
public Long apply(Long aLong) throws Exception {
return count - aLong;
}
})
.observeOn(AndroidSchedulers.mainThread())//ui线程中进行控件更新
.doOnSubscribe(new Consumer<Disposable>() {
@Override
public void accept(Disposable disposable) throws Exception {
button.setEnabled(false);
button.setTextColor(Color.BLACK);
}
}).subscribe(new Observer<Long>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Long num) {
button.setText("剩余" + num + "秒");
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
//回复原来初始状态
button.setEnabled(true);
button.setText("发送验证码");
}
});
}