RxJava2系列实践之倒计时功能(三)
来源:互联网 发布:mysql 1064 syntax 编辑:程序博客网 时间:2024/05/22 12:16
前言
通过本系列前两篇的学习,相信各位码友已经基本掌握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用来演示点击获取验证码,并开启倒计时重新获取的功能。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="15dp" tools:context="com.holmeslei.rxjava2demo.ui.CountDownActivity"> <Button android:id="@+id/btn_get_code" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="获取验证码" /></RelativeLayout>
Activity
由于业务逻辑简单,所以就不整什么复杂的框架了,功能都在Activity中实现。
- 第一步,使用ButterKnife依赖注入获取Button的实例及设置其点击监听方法。
- 第二步,点击Button后首先将其设置为不可点击,然后初始化全局变量Disposable。
- 第三步,使用Flowable的intervalRange操作符,从0开始每隔1s发射一个自增的数字,持续11次,延迟0s执行。这样就设定好了10秒的倒计时,可根据实际需要修改时长。
- 由于需要刷新UI,所以设定观察者执行在Android的UI线程。
- 在doOnNext的回调中更新Button的显示UI,达到读秒的效果。
- 在doOnComplete的完成回调中重新将Button设置为可点击,然后设置显示UI。
- 最后调用后subscribe()订阅,这样一个完整的异步事件流就完成了。
- 别忘了在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<Long>() { @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的地址:
RxJava2Demo
另外:欢迎光临我的Hexo个人博客:Lei’s Blog
阅读全文
0 0
- RxJava2系列实践之倒计时功能(三)
- Mahout系列之核心功能实践
- RxJava2系列之背压策略(一)
- Javascript实践之倒计时时差
- RxJava2总结之操作详解(三)
- Rxjava2(三)
- Android Tip 之倒计时功能
- iOS之实现倒计时功能
- Android UI系列之倒计时
- RxJava2系列之相较RxJava1的更新之处(二)
- 软件测试实践系列之三、四已经完成
- RxJava2的do系列操作符之doOnNext和doFinally
- Android进阶之抢购倒计时功能
- RxJava2.0教程(三)
- RxJava2.0使用(三)
- Rxjava2源码分析(三)
- 倒计时功能
- 倒计时功能
- Android应用在更新版本时的出现的问题
- GDAL分块处理流程
- c++中多重继承
- 好东西来了!2017云栖大会400+份重磅资料下载
- JavaScript中的作用域(链)和闭包(一)
- RxJava2系列实践之倒计时功能(三)
- 根据Map的value值进行排序
- 不换行结尾用其他符号代替css写法
- 详解自动售货机设计原理方案
- How to set splash timeout in scrapy-splash?
- log4j自动发送错误日志邮件
- Spring注解@Autowired @Repository @Qualifier
- 【BZOJ2190】仪仗队(欧拉函数)
- iOS开发业界毒瘤 Hook