RxJava创建倒计时器

本文介绍如何使用RxJava在Android应用中创建一个倒计时器,尤其是在结合网络请求和UI更新的场景下。在点击按钮触发网络请求后,发现连续点击会导致多个倒计时并行运行。解决这个问题的方法是在开始新计时前检查并取消旧的计时器。通过使用flatMap操作符和适当的线程切换,可以实现更加简洁和优雅的代码,达到预期效果。
摘要由CSDN通过智能技术生成

用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) {
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值