Rxjava實現發送驗證碼倒計時功能

倒計時功能被廣泛運用在 App 啓動頁、短信驗證碼倒計時等,通常做法是創建一個Handler ,在子線程裏完成倒計時,如今這一做法有了替代品 —— RxJava ,RxJava是被行內一致認可的第三方開源庫,我們可以使用RxJava實現倒計時功能。

效果圖如下:

圖一

 

圖二

 

1.在build.gradle裏引入兩個依賴庫:

 implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
 implementation 'io.reactivex.rxjava2:rxjava:2.1.10'

2.佈局文件(很簡單,只有一個TextView)

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".CountDownActivity">
    <TextView
        android:id="@+id/tv_count_down"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        android:text="獲取驗證碼"
        android:textSize="35sp"
        android:textColor="#000"
        android:background="#f97e7e"/>

</android.support.constraint.ConstraintLayout>

3.實現倒計時功能:

public class CountDownActivity extends AppCompatActivity implements View.OnClickListener {
    private TextView tv_count_down;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_count_down);
        tv_count_down = findViewById(R.id.tv_count_down);
        tv_count_down.setOnClickListener(this);


    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.tv_count_down:
                final int count = 30;
                Observable mObservable = Observable.interval(0, 1, TimeUnit.SECONDS)//設置0延遲,每隔一秒發送一條數據
                        .take(count + 1)//設置循環次數
                        .subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .map(new Function<Long, Long>() {
                            @Override
                            public Long apply(Long aLong) throws Exception {
                                return count - aLong;
                            }
                        });

                Observer observer = new Observer<Long>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(Long aLong) {//接受到一條就會操作一次UI
                        tv_count_down.setText("倒計時:" + aLong + "秒");
                        tv_count_down.setTextColor(Color.WHITE);

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onComplete() {
                        tv_count_down.setText("獲取驗證碼");//數據發送完後設置爲原來的文字
                        tv_count_down.setEnabled(true);
                        tv_count_down.setTextColor(Color.BLACK);
                        tv_count_down.setBackgroundColor(Color.parseColor("#f97e7e"));//數據發送完後設置爲原來背景色

                    }
                };

                mObservable.doOnSubscribe(new Consumer<Disposable>() {
                    @Override
                    public void accept(Disposable disposable) throws Exception {

                        tv_count_down.setEnabled(false);//在發送數據的時候設置爲不能點擊

                        tv_count_down.setBackgroundColor(Color.GRAY);//背景色設爲灰色

                    }
                }).subscribe(observer);
                break;
        }
    }
}

至此倒計時功能實現

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章