博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RxJava2系列实践之倒计时功能(三)
阅读量:6371 次
发布时间:2019-06-23

本文共 2856 字,大约阅读时间需要 9 分钟。

前言

  通过本系列前两篇的学习,相信各位码友已经基本掌握RxJava2怎么使用了,本篇我们一起来通过一个小例子实践一下,也可以加深印象。来看看如何使用RxJava2的intervalRange操作符实现倒计时功能。

  

依赖

  首先添加依赖,Demo中使用了ButterKnife注入,各版本以当前最新的为准。

dependencies {    ......    compile 'io.reactivex.rxjava2:rxjava:2.1.3'    compile 'io.reactivex.rxjava2:rxandroid:2.0.1'    compile 'com.jakewharton:butterknife:8.7.0'    annotationProcessor 'com.jakewharton:butterknife-compiler:8.7.0'}复制代码

intervalRange操作符

  别着急上代码,开始前我们先来了解下intervalRange操作符(了解过的可以忽略哈)。

  intervalRange(long start, long count, long initialDelay, long period, TimeUnit unit)

  • start:起始数值
  • count:发射数量
  • initialDelay:延迟执行时间
  • period:发射周期时间
  • unit:时间单位

  一句话简介就是延迟initialDelay个unit单位后,以period为周期,依次发射count个以start为初始值并递增的数字。

布局

  布局中放一个Button用来演示点击获取验证码,并开启倒计时重新获取的功能。

复制代码

Activity

  由于业务逻辑简单,所以就不整什么复杂的框架了,功能都在Activity中实现。

  1. 第一步,使用ButterKnife依赖注入获取Button的实例及设置其点击监听方法。
  2. 第二步,点击Button后首先将其设置为不可点击,然后初始化全局变量Disposable。
  3. 第三步,使用Flowable的intervalRange操作符,从0开始每隔1s发射一个自增的数字,持续11次,延迟0s执行。这样就设定好了10秒的倒计时,可根据实际需要修改时长。
  4. 由于需要刷新UI,所以设定观察者执行在Android的UI线程。
  5. 在doOnNext的回调中更新Button的显示UI,达到读秒的效果。
  6. 在doOnComplete的完成回调中重新将Button设置为可点击,然后设置显示UI。
  7. 最后调用后subscribe()订阅,这样一个完整的异步事件流就完成了。
  8. 别忘了在Activity销毁时将全局Disposable取消订阅销毁掉。使用RxJava将无用的Disposable及时销毁是一个很好的习惯,否则后期就得忙着处理各种OOM异常啦。
public class CountDownActivity extends AppCompatActivity {    @BindView(R.id.btn_get_code)    Button btnGetCode;    private Disposable mdDisposable;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_count_down);        ButterKnife.bind(this);    }    @OnClick(R.id.btn_get_code)    public void onViewClicked() {        //点击后置为不可点击状态        btnGetCode.setEnabled(false);        //从0开始发射11个数字为:0-10依次输出,延时0s执行,每1s发射一次。        mdDisposable = Flowable.intervalRange(0, 11, 0, 1, TimeUnit.SECONDS)                .observeOn(AndroidSchedulers.mainThread())                .doOnNext(new Consumer
() { @Override public void accept(Long aLong) throws Exception { btnGetCode.setText("重新获取(" + (10 - aLong) + ")"); } }) .doOnComplete(new Action() { @Override public void run() throws Exception { //倒计时完毕置为可点击状态 btnGetCode.setEnabled(true); btnGetCode.setText("获取验证码"); } }) .subscribe(); } @Override protected void onDestroy() { super.onDestroy(); if (mdDisposable != null) { mdDisposable.dispose(); } }}复制代码

运行效果

  最后看一下运行效果Gif。

  
运行效果

总结

  本篇文章利用RxJava2演示了一个倒计时的小栗子,更多的用法还待各位码友去探索与发现哈。

  进阶中的码猿一枚,写的不对的地方欢迎大神们留言指正,有什么疑惑或者建议也可以在我Github上RxJava2Demo项目Issues中提出,我会及时回复。
  附上RxJava2Demo的地址:
  

  另外:欢迎光临我的Hexo个人博客:

转载地址:http://gdyqa.baihongyu.com/

你可能感兴趣的文章
springboot 没有跳转到指定页面
查看>>
NSNumber 与NSValue
查看>>
php中urlencode和urldecode的用法
查看>>
Flutter & Dart 安装在window系统
查看>>
uwp - 上滑隐藏导航栏下滑显示
查看>>
sitecore系列教程之如何以编程方式将访客数据关联到联系人卡片
查看>>
如何修改DEDECMS文章标题长度
查看>>
工控随笔_14_西门子_Step7项目:打开项目不可用解决方法
查看>>
Python-定时爬取指定城市天气(一)-发送给关心的微信好友
查看>>
请不要怪罪流程
查看>>
csharp: Socket
查看>>
转 码农提高工作效率
查看>>
Maven实战(七)——常用Maven插件介绍(上)
查看>>
Web优化 页面性能优化 自定义函数延迟触发 jquery插件
查看>>
STL中map用法详解 (转)
查看>>
xampp中apache不能启动解决方法 (share)
查看>>
Visual Studio Xamarin编译Android项目出错的解决办法
查看>>
CP,SCP 命令(包括windows与linux用xshell互传)
查看>>
[转]TypeScript Quick start
查看>>
[转]Global exception handling in Web API 2.1 and NLog
查看>>