用RxJava创建一个倒计时计时器,感觉是一个很简单的事情,用intervalRange操作符就可以搞定了。但是我的场景是,需要点击Button(重新获取数据)去进行网络请求,将请求的结果进行UI显示,并进行倒计时计算。网络请求的返回体如下所示:
public class Response {
private String data; // 网络请求的数据
private long countDownSeconds; // 剩余的时间数,单位 s
}
我的初步实现如下(MainActivity.java):
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private Disposable disposable;
private TextView countDownMsgTv, dataTv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = findViewById(R.id.bt_click);
countDownMsgTv = findViewById(R.id.tv_count_down);
dataTv = findViewById(R.id.tv_data);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Observable.just(getResponse()) // mock网络请求
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Response>() {
@Override
public void accept(Response response) throws Exception {
dataTv.setText(response.getData());
// 计时器
countDown(response.getCountDownSeconds());
}
});
}
});
}
// 使用RxJava来构建计时器
private void countDown(final long countDownSeconds){
Observable.intervalRange(0, countDownSeconds, 0, 1, TimeUnit.SECONDS)
.map(new Function<Long, Long>() {
@Override
public Long apply(Long aLong) throws Exception {
return countDownSeconds -aLong;
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Long>() {
@Override
public void onSubscribe(Disposable d) {