倒計時功能被廣泛運用在 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;
}
}
}
至此倒計時功能實現