經過本系列前兩篇的學習,相信各位碼友已經基本掌握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佈局