全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

需求:

有多个组件可以开启倒计时,正常情况下默认倒计时时间终了后更新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 开发线程的分析  # 是在  # 回调  # 小编  # 多个  # 在此  # 不需要  # 这样做  # 给大家  # 可以使用  # 用户可以  # 更方便  # 所述  # 给我留言  # 感谢大家  # 如何实现  # 疑问请  # 有任何  # 情况下  # 请等待 


相关文章: 名字制作网站免费,所有小说网站的名字?  长沙企业网站制作哪家好,长沙水业集团官方网站?  高端企业智能建站程序:SEO优化与响应式模板定制开发  如何注册花生壳免费域名并搭建个人网站?  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  阿里云网站制作公司,阿里云快速搭建网站好用吗?  Swift中循环语句中的转移语句 break 和 continue  c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】  沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?  宁波免费建站如何选择可靠模板与平台?  成都网站制作报价公司,成都工业用气开户费用?  网站插件制作软件免费下载,网页视频怎么下到本地插件?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  广德云建站网站建设方案与建站流程优化指南  郑州企业网站制作公司,郑州招聘网站有哪些?  宝塔新建站点报错如何解决?  如何在云虚拟主机上快速搭建个人网站?  广平建站公司哪家专业可靠?如何选择?  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  七夕网站制作视频,七夕大促活动怎么报名?  建站之星如何实现五合一智能建站与营销推广?  如何解决ASP生成WAP建站中文乱码问题?  如何规划企业建站流程的关键步骤?  如何选择最佳自助建站系统?快速指南解析优劣  ,南京靠谱的征婚网站?  如何快速上传建站程序避免常见错误?  ,sp开头的版面叫什么?  清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  在线教育网站制作平台,山西立德教育官网?  网站制作大概多少钱一个,做一个平台网站大概多少钱?  ,如何利用word制作宣传手册?  建站之星代理如何获取技术支持?  建站之星如何一键生成手机站?  网站设计制作公司地址,网站建设比较好的公司都有哪些?  如何通过VPS建站实现广告与增值服务盈利?  如何通过二级域名建站提升品牌影响力?  教程网站设计制作软件,怎么创建自己的一个网站?  昆明网站制作哪家好,昆明公租房申请网上登录入口?  建站之星图片链接生成指南:自助建站与智能设计教程  免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?  自助网站制作软件,个人如何自助建网站?  如何选择域名并搭建高效网站?  攀枝花网站建设,攀枝花营业执照网上怎么年审?  建站之星如何快速解决建站难题?  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  建站IDE高效指南:快速搭建+SEO优化+自适应模板全解析  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  企业网站制作公司网页,推荐几家专业的天津网站制作公司?  义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。