经过本系列前两篇的学习,相信各位码友已经基本掌握RxJava2怎么使用了,本篇咱们一块儿来经过一个小例子实践一下,也能够加深印象。来看看如何使用RxJava2的intervalRange操做符实现倒计时功能。
java
首先添加依赖,Demo中使用了ButterKnife注入,各版本以当前最新的为准。react
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(long start, long count, long initialDelay, long period, TimeUnit unit) android
一句话简介就是延迟initialDelay个unit单位后,以period为周期,依次发射count个以start为初始值并递增的数字。git
布局中放一个Button用来演示点击获取验证码,并开启倒计时从新获取的功能。github
<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中实现。框架
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 ide
另外:欢迎光临个人Hexo我的博客:Lei’s Blog布局