美文网首页Android开发AndroidAndroid 进阶之路
【 Android 】使用 RxJava2 实现倒计时功能

【 Android 】使用 RxJava2 实现倒计时功能

作者: Tyhoo_Wu | 来源:发表于2018-03-03 08:27 被阅读1273次

    倒计时功能被广泛运用在 App 启动页、短信验证码倒计时等,通常做法是起一个Handler ,在子线程里完成倒计时,如今这一做法有了替代品 —— RxJavaRxJava是被行内一致认可的第三方开源库,我们可以使用RxJava实现倒计时功能。

    示例图:


    示例图.gif

    示例代码:

    1. 导入必要的库文件(Android支持库和Reactivex系列支持库)
    implementation 'com.android.support:appcompat-v7:27.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    
    implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
    implementation 'io.reactivex.rxjava2:rxjava:2.1.10'
    
    1. 布局文件(很简单,只有一个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="com.haocent.android.countdown.MainActivity">
    
        <TextView
            android:id="@+id/tv_count_down"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="16sp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            tools:text="Hello World!" />
    
    </android.support.constraint.ConstraintLayout>
    
    1. 实现倒计时功能(代码清晰明了,也打出了相应的Log
    public class MainActivity extends AppCompatActivity {
    
        private static final String TAG = MainActivity.class.getSimpleName();
    
        private Disposable mDisposable;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main_activity);
    
            final TextView tvCountDown = findViewById(R.id.tv_count_down);
    
            // 倒计时 10s
            mDisposable = Flowable.intervalRange(0, 11, 0, 1, TimeUnit.SECONDS)
                    .observeOn(AndroidSchedulers.mainThread())
                    .doOnNext(new Consumer<Long>() {
                        @Override
                        public void accept(Long aLong) throws Exception {
                            Log.d(TAG, "倒计时");
    
                            tvCountDown.setText("倒计时 " + String.valueOf(10 - aLong) + " 秒");
                        }
                    })
                    .doOnComplete(new Action() {
                        @Override
                        public void run() throws Exception {
                            Log.d(TAG, "倒计时完毕");
    
                            Toast.makeText(MainActivity.this, "倒计时完毕", Toast.LENGTH_SHORT).show();
                        }
                    })
                    .subscribe();
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
    
            if (mDisposable != null) {
                mDisposable.dispose();
            }
        }
    }
    

    说明:① 在doOnNext里面做倒计时UI更改,在doOnComplete里面做倒计时完成之后的操作,如弹Toast或者跳转等;② 我们调用重复执行的方法,所以要在onDestroy方法中取消订阅。

    相关文章

      网友评论

      • 我是一只小壳蟆:博主有没有试过在dialogfragment里用rxjava写倒计时,好像会泄露,有没有好的解决方法:pray:
        SmartSean:@我是一只小壳蟆 泄露那就解决泄露,
      • 戴定康:小知识
      • 顾二公子:用RxJava2实现定时器确实很好用,强烈推荐

      本文标题:【 Android 】使用 RxJava2 实现倒计时功能

      本文链接:https://www.haomeiwen.com/subject/dzioxftx.html