Android 中不用线程如何实现倒计时

发布时间 - 2026-01-10 22:23:47    点击率:

需求:

有多个组件可以开启倒计时,正常情况下默认倒计时时间终了后更新UI,另,用户可以取消指定倒计时。

这里使用CountDownTimer进行倒计时,其中回调函数onFinish是在倒计时终了时回调,onTick是在倒计时开始时回调,用户可以使用CountDownTimer对象的cancel方法取消倒计时。

这样做的好处:不需要使用繁琐的线程去控制倒计时,更方便的进行UI更新。

上代码:

MainActivity

package test.demo.countdowntest;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
  private Button bt1, bt2, bt3;
  private ProgressBar pb1, pb2, pb3;
  private MyCount mc1,mc2, mc3;
  private boolean mc1Click = false;
  private boolean mc2Click = false;
  private boolean mc3Click = false;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    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 = new MyCount(30000, 1000);
    mc1.setPb(bt1, pb1);
    mc2 = new MyCount(30000, 1000);
    mc2.setPb(bt2, pb2);
    mc3 = new MyCount(30000, 1000);
    mc3.setPb(bt3, pb3);
  }
  @Override
  public void onClick(View view) {
    switch (view.getId()) {
      case R.id.bt1:
        if (mc1Click) {
          mc1.cancel();
          pb1.setVisibility(View.GONE);
          mc1Click = false;
        } else {
          pb1.setVisibility(View.VISIBLE);
          mc1.start();
          mc1Click = true;
        }
        break;
      case R.id.bt2:
        if (mc2Click) {
          pb2.setVisibility(View.GONE);
          mc2.cancel();
          mc2Click = false;
        } else {
          pb2.setVisibility(View.VISIBLE);
          mc2.start();
          mc2Click = true;
        }
        break;
      case R.id.bt3:
        if (mc3Click) {
          pb3.setVisibility(View.GONE);
          mc3.cancel();
          mc3Click = false;
        } else {
          pb3.setVisibility(View.VISIBLE);
          mc3.start();
          mc3Click = true;
        }
        break;
    }
  }
  /*定义一个倒计时的内部类*/
  class MyCount extends CountDownTimer {
    Button mBt;
    ProgressBar mPb;
    public MyCount(long millisInFuture, long countDownInterval) {
      super(millisInFuture, countDownInterval);
    }
    public void setPb(Button bt, ProgressBar pb) {
      mBt = bt;
      mPb = pb;
    }
    @Override
    public void onFinish() {
      mPb.setVisibility(View.GONE);
    }
    @Override
    public void onTick(long millisUntilFinished) {
      mBt.setText("请等待30秒(" + millisUntilFinished / 1000 + ")...");
      Toast.makeText(MainActivity.this, millisUntilFinished / 1000 + "", Toast.LENGTH_LONG).show();
    }
  }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns: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 中不用线程如何实现倒计时,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# android  # 线程倒计时  # 倒计时  # android使用AsyncTask实现多线程下载实例  # android主线程和子线程之间消息传递详解  # Android线程实现图片轮播  # Android使用listview实现分页刷新(线程休眠模拟)  # Android Socket 线程连接openwrt与arduino单片机串口双向通信的实例解析  # Android 中通过实现线程更新Progressdialog (对话进度条)  # Android实现网络多线程断点续传下载实例  # Android 开发线程的分析  # 是在  # 回调  # 小编  # 多个  # 在此  # 不需要  # 这样做  # 给大家  # 可以使用  # 用户可以  # 更方便  # 所述  # 给我留言  # 感谢大家  # 如何实现  # 疑问请  # 有任何  # 情况下  # 请等待 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何构建RESTful API_Laravel标准化API接口开发指南  如何快速重置建站主机并恢复默认配置?  Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  如何在橙子建站上传落地页?操作指南详解  网站制作价目表怎么做,珍爱网婚介费用多少?  bootstrap日历插件datetimepicker使用方法  实例解析Array和String方法  进行网站优化必须要坚持的四大原则  打开php文件提示内存不足_怎么调整php内存限制【解决方案】  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】  如何基于云服务器快速搭建个人网站?  图册素材网站设计制作软件,图册的导出方式有几种?  Laravel中的Facade(门面)到底是什么原理  如何在云虚拟主机上快速搭建个人网站?  Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)  Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  Laravel如何配置Horizon来管理队列?(安装和使用)  非常酷的网站设计制作软件,酷培ai教育官方网站?  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  怎么用AI帮你为初创公司进行市场定位分析?  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】  JavaScript模板引擎Template.js使用详解  如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环  Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权  英语简历制作免费网站推荐,如何将简历翻译成英文?  Android中AutoCompleteTextView自动提示  Internet Explorer官网直接进入 IE浏览器在线体验版网址  uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址  PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑  深入理解Android中的xmlns:tools属性  Laravel PHP版本要求一览_Laravel各版本环境要求对照  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  如何在服务器上三步完成建站并提升流量?  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  详解Oracle修改字段类型方法总结  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  Laravel如何配置和使用缓存?(Redis代码示例)  香港服务器部署网站为何提示未备案?  南京网站制作费用,南京远驱官方网站?  UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】