主要是为了把休眠和倒计时放到子线程中,同时只能在主线程修改button的文字等信息。
代码中resendbtn就是要在上面显示倒计时的按钮,second是倒计时秒数,执行过程在执行子线程中的倒计时之前,先把按钮禁用,然后执行子线程中的循环,子线程中每调用一次e.onnext方法都会执行一次主线程的onNext方法,子线程负责休眠和倒计时,主线程的onNext方法负责修改button。直到子线程中的循环结束,调用e.onComplete方法,到主线程中把按钮设置可用,完成整个过程。其中子线程和主线程一共交互了second+1次,所以设置subscription.request(second+1)。
/**
* 重新发送按钮倒计时
* @param second
*/
private void clockButton(final int second) {
//用来在执行子线程中的FlowableOnSubscribe的subscribe方法之前执行
Consumer consumer = new Consumer() {
@Override
public void accept(Object o) throws Exception {
reSendBtn.setClickable(false);
reSendBtn.setBackgroundResource(R.color.white_smoke);
}
};
//返回主线程执行
FlowableSubscriber subscriber = new FlowableSubscriber<Integer>() {
@Override
public void onSubscribe(Subscription s) {
s.request(second+1);//需要接收,1秒一条,还有最后一个onComplete
}
@Override
public void onNext(Integer i) {
reSendBtn.setText("重新发送("+i+")");
}
@Override
public void onError(Throwable t) {
Log.e("FlowableSubscriber", "onError: ");
}
@Override
public void onComplete() {
Log.d("FlowableSubscriber", "onComplete: ");
reSendBtn.setText("重新发送");
reSendBtn.setClickable(true);
reSendBtn.setBackgroundResource(R.color.orangeRed);
}
};
//在子线程中执行
Flowable<Integer> flowable = Flowable.create(new FlowableOnSubscribe<Integer>() {
@Override
public void subscribe(FlowableEmitter<Integer> e) throws Exception {
int ss = second;//倒计时ss秒
while (ss>0){
e.onNext(ss);
ss--;
Thread.sleep(1000);
}
e.onComplete();
}
}, BackpressureStrategy.BUFFER);//BUFFER就是把RxJava中默认的只能存128个事件的缓存池换成一个大的缓存池,支持存很多很多的数据。
flowable.subscribeOn(Schedulers.io()).doOnSubscribe(consumer)
.observeOn(AndroidSchedulers.mainThread()).subscribe(subscriber);
}