android使用Rxjava实现倒计时功能

网友投稿 436 2023-01-27


android使用Rxjava实现倒计时功能

一般我们在开发JasetTIj时,常会遇到使用倒计时的场景,以前一般会使用thread+handler来实现,而强大的Rxjava横空出世后,使这一切变得简单了。我们可以在子线程中直接使用发射器每融1S发出一个时间,在主线程中接收更新ui,在等倒计时结束恢复界面,下面给出在用户注册时获取验证码的,倒计时使用的代码demo。具体调用方法如下:

/**

* 点击获取验证码,10S倒计时,利用Rxjava进行线程切换

* @param view

*/

public void getSureCode(View view) {

Observable.create(new ObservableOnSubscribe() {

@Override

public void subscribe(ObservableEmitter emitter) throws Exception {

int i = 10;

while (i >= 0) {

try {

Thread.sleep(1000);

emitter.onNext(i);

} catch (InterruptedException e) {

e.printStackTrace();

}

i--;

}

emitter.onComplete();

}

}).subscribeOn(Schedulers.io())// 此方法为上面发出事件设置线程为IO线程

.observeOn(androidSchedulers.mainThread())// 为消耗事件设置线程为UI线程

.subscribe(new Consumer() {

@Override

public void accept(Integer integer) throws Exception {

bindingView.countDownTv.setClickable(integer > 0 ? false : true);

bindingView.countDownTv.setBackground(integer > 0 ? getResources().getDrawable(R.drawable.rectangle_gray_bg) : getResources().getDrawable(R.drawable.rectanghttp://le_red_bg));

if(integer > 0) {

String content = integer + "秒后可重新发送";

SpannableString span = new SpannableString(content);

int index = content.indexOf("后");

span.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.colorTheme)), 0, index, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //设置前景色为红色

bindingView.countDownTv.setText(span);

} else {

bindingView.countDownTv.setText(getString(R.string.get_check_code));

}

}

});

}

下面的是布局文件,布局只有一个TextView控件,这里采用了dataBinding进行控件的绑定:

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

tools:context="com.smilexie.countdownwithrxjava.MainActivity">

android:id="@+id/count_down_tv"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_margin="10dp"

android:gravity="center"

android:layout_gravity="center_vertical"

android:padding="8dp"

android:background="@drawable/rectangle_red_bg"

android:text="@string/get_check_code"

android:textSize="14sp"

android:textColor="@color/white"

android:onClick="getSureCode"/>

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

tools:context="com.smilexie.countdownwithrxjava.MainActivity">

android:id="@+id/count_down_tv"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_margin="10dp"

android:gravity="center"

android:layout_gravity="center_vertical"

android:padding="8dp"

android:background="@drawable/rectangle_red_bg"

android:text="@string/get_check_code"

android:textSize="14sp"

android:textColor="@color/white"

android:onClick="getSureCode"/>

android:id="@+id/count_down_tv"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_margin="10dp"

android:gravity="center"

android:layout_gravity="center_vertical"

android:padding="8dp"

android:background="@drawable/rectangle_red_bg"

android:text="@string/get_check_code"

android:textSize="14sp"

android:textColor="@color/white"

android:onClick="getSureCode"/>

这里定义了两个drawable用来对倒计时背景的更换,倒计时时不允许对控件进行点击:

rectangle_gray_bg.xml文件

android:shape="rectangle">

android:shape="rectangle">

rectangle_gray_bg.xml

android:shape=http://"rectangle">

android:shape=http://"rectangle">

两个颜色值:

#FFDDDDDD

#f64a33


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:webpack手动配置React开发环境的步骤
下一篇:通信怎么连接共享文件夹(怎么连上共享文件夹)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~