Android 中不用线程如何实现倒计时
需求:
有多个组件可以开启倒计时,正常情况下默认倒计时时间终了后更新UI,另,用户可以取消指定倒计时。
这里使用CountDownTimer进行倒计时,其中回调函数onFinish是在倒计时终了时回调,onTick是在倒计时开始时回调,用户可以使用CountDownTimer对象的cancel方法取消倒计时。
这样做的好处:不需要使用繁琐的线程去控制倒计时,更方便的进行UI更新。
上代码:
MainActivity
packagetest.demo.countdowntest;
importandroid.os.Bundle;
importandroid.os.CountDownTimer;
importandroid.support.v7.app.AppCompatActivity;
importandroid.view.View;
importandroid.widget.Button;
importandroid.widget.ProgressBar;
importandroid.widget.Toast;
publicclassMainActivityextendsAppCompatActivityimplementsView.OnClickListener{
privateButtonbt1,bt2,bt3;
privateProgressBarpb1,pb2,pb3;
privateMyCountmc1,mc2,mc3;
privatebooleanmc1Click=false;
privatebooleanmc2Click=false;
privatebooleanmc3Click=false;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt1=((Button)findViewById(R.id.bt1));
bt2=((Button)findViewById(R.id.bt2));
bt3=((Button)findViewById(R.id.bt3));
bt1.setOnClickListener(this);
bt2.setOnClickListener(this);
bt3.setOnClickListener(this);
pb1=((ProgressBar)findViewById(R.id.pb1));
pb2=((ProgressBar)findViewById(R.id.pb2));
pb3=((ProgressBar)findViewById(R.id.pb3));
mc1=newMyCount(30000,1000);
mc1.setPb(bt1,pb1);
mc2=newMyCount(30000,1000);
mc2.setPb(bt2,pb2);
mc3=newMyCount(30000,1000);
mc3.setPb(bt3,pb3);
}
@Override
publicvoidonClick(Viewview){
switch(view.getId()){
caseR.id.bt1:
if(mc1Click){
mc1.cancel();
pb1.setVisibility(View.GONE);
mc1Click=false;
}else{
pb1.setVisibility(View.VISIBLE);
mc1.start();
mc1Click=true;
}
break;
caseR.id.bt2:
if(mc2Click){
pb2.setVisibility(View.GONE);
mc2.cancel();
mc2Click=false;
}else{
pb2.setVisibility(View.VISIBLE);
mc2.start();
mc2Click=true;
}
break;
caseR.id.bt3:
if(mc3Click){
pb3.setVisibility(View.GONE);
mc3.cancel();
mc3Click=false;
}else{
pb3.setVisibility(View.VISIBLE);
mc3.start();
mc3Click=true;
}
break;
}
}
/*定义一个倒计时的内部类*/
classMyCountextendsCountDownTimer{
ButtonmBt;
ProgressBarmPb;
publicMyCount(longmillisInFuture,longcountDownInterval){
super(millisInFuture,countDownInterval);
}
publicvoidsetPb(Buttonbt,ProgressBarpb){
mBt=bt;
mPb=pb;
}
@Override
publicvoidonFinish(){
mPb.setVisibility(View.GONE);
}
@Override
publicvoidonTick(longmillisUntilFinished){
mBt.setText("请等待30秒("+millisUntilFinished/1000+")...");
Toast.makeText(MainActivity.this,millisUntilFinished/1000+"",Toast.LENGTH_LONG).show();
}
}
}
activity_main.xml
<?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:orientation="vertical" tools:context="cn.sh.changxing.countdowntest.MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/bt1" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="测试启动1"/> <ProgressBar android:id="@+id/pb1" style="?android:attr/progressBarStyleSmall" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:indeterminate="true"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/bt2" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="测试启动2"/> <ProgressBar android:id="@+id/pb2" style="?android:attr/progressBarStyleSmall" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:indeterminate="true"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/bt3" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="测试启动3"/> <ProgressBar android:id="@+id/pb3" style="?android:attr/progressBarStyleSmall" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:indeterminate="true"/> </LinearLayout> </LinearLayout>
以上所述是小编给大家介绍的Android中不用线程如何实现倒计时,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!