之前写发送验证码倒计时功能时都是自定义的CountdownView,最近想用RxJava实现以下,就当做个简单得小记录!
```
private fun initSendMsg() {
val timer:TextView = findViewById(R.id.sendCode)
var mSubscription:Subscription?= null // Subscription 对象,用于取消订阅关系,防止内存泄露
//开始倒计时,用 RxJava2 实现
val count = 59L
Flowable.interval(0, 1, TimeUnit.SECONDS) //设置0延迟,每隔一秒发送一条数据
.onBackpressureBuffer() //加上背压策略
.take(count) // 设置循环次数
.map { aLong ->
count - aLong
}
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object :Subscriber<Long> {
override fun onComplete() {
timer.text = "点击重发"
timer.isEnabled = true
timer.setTextColor(Color.parseColor("#FFF5721E"))
mSubscription?.cancel() //取消订阅,防止内存泄漏
}
override fun onNext(t:Long?) {
timer.text = "${t}s" //接受到一条就是会操作一次UI
timer.setTextColor(Color.parseColor("#FF333333"))
}
override fun onError(t:Throwable?) {
t?.printStackTrace()
}
override fun onSubscribe(s:Subscription?) {
timer.isEnabled = false //在发送数据的时候设置为不能点击
timer.setTextColor(Color.parseColor("#0cFFFFFF")) //背景色设为灰色
mSubscription = s
s?.request(Long.MAX_VALUE) //设置请求事件的数量,重要,必须调用
}
})
}
```