热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android实现计时器功能

这篇文章主要为大家详细介绍了Android实现计时器功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Android实现计时器功能的具体代码,供大家参考,具体内容如下

计时器工具类

import android.annotation.SuppressLint;
import android.os.Handler;
import android.os.Message;
 
import androidx.annotation.NonNull;
 
import java.util.Timer;
import java.util.TimerTask;
 
/**
 * 用于计时,在主线程中使用此方法
 */
public class ChjTimer {
 
    private int time;//设置倒计时 X 秒
    private int interval = 1000;//设置间隔时间
    private ChjTimerInter chjTimerInter; //回调
    private Timer timer; // 定时器
    private static final int WHAT_REFREH = 0;//刷新
 
    /**
     * 创建对象则开始计时
     *
     * @param chjTimerInter 接口回调
     */
    public ChjTimer(ChjTimerInter chjTimerInter) {
        this.chjTimerInter = chjTimerInter;
    }
 
    /**
     * 创建对象开始计时
     * @param interval      间隔时间通知(使用第一个方法,默认1秒钟刷新一次)
     * @param chjTimerInter 接口回调
     */
    public ChjTimer(int interval, ChjTimerInter chjTimerInter) {
        this.chjTimerInter = chjTimerInter;
        this.interval = interval;
    }
 
    /**
     * 开始计时
     */
    public void start(int time) {
        this.time = time;
        if (timer == null){
            timer = new Timer();
        } else {
            stop();
            return;
        }
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                timesss.sendMessage(new Message());
            }
        }, interval);
    }
 
    /**
     * 终止计时
     */
    public void stop() {
        if (timer != null) {
            timer.cancel();
            timer = null;
        }
        if (timesss != null) timesss.removeMessages(WHAT_REFREH);
        if (chjTimerInter != null)chjTimerInter.stop(time);
    }
 
    @SuppressLint("HandlerLeak")
    private Handler timesss = new Handler() {
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            if (msg.what != WHAT_REFREH) return;
            time -= 1;
            if (chjTimerInter != null) chjTimerInter.second(time);
            if (time == 0) {
                if (timer == null) return;
                timer.cancel();
                timer = null;
                if (chjTimerInter != null) chjTimerInter.expire();
            } else if (time > 0) {
                timer.schedule(new TimerTask() {
                    @Override
                    public void run() {
                        timesss.sendMessage(new Message());
                    }
                }, interval);
            }
        }
    };
 
    /**
     * 接口
     */
    public interface ChjTimerInter {
 
        /**
         * 间隔时间内回调
         */
        void second(int time);
 
        /**
         * 完成回调
         */
        void expire();
 
        /**
         * 终止计时
         */
        void stop(int time);
 
    }
 
}

使用演示

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
 
public class MainActivity extends Activity implements View.OnClickListener, ChjTimer.ChjTimerInter {
 
    private TextView tiems,timnew;
    private ChjTimer chjTimer;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tiems = findViewById(R.id.time);
        timnew = findViewById(R.id.timnew);
        findViewById(R.id.but).setOnClickListener(this);
        findViewById(R.id.buts).setOnClickListener(this);
 
        chjTimer = new ChjTimer(this);
    }
 
    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.but:
                tiems.setText("10");
                timnew.setText("正在计时");
                chjTimer.start(10);
                break;
            case R.id.buts:
                chjTimer.stop();
                break;
        }
    }
 
    @Override
    public void second(int time) {
        tiems.setText(time + "");
    }
 
    @Override
    public void expire() {
        timnew.setText("计时完成");
    }
 
    @Override
    public void stop(int time) {
        timnew.setText("计时终止" + time);
    }
}

页面布局

<&#63;xml version="1.0" encoding="utf-8"&#63;>

 
    
 
    
 
 
    

演示效果 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 本文探讨了Android系统中支持的图像格式及其在不同版本中的兼容性问题,重点涵盖了存储、HTTP传输、相机功能以及SparseArray的应用。文章详细分析了从Android 10 (API 29) 到Android 11 的存储规范变化,并讨论了这些变化对图像处理的影响。此外,还介绍了如何通过系统升级和代码优化来解决版本兼容性问题,以确保应用程序在不同Android版本中稳定运行。 ... [详细]
  • 利用树莓派畅享落网电台音乐体验
    最近重新拾起了闲置已久的树莓派,这台小巧的开发板已经沉寂了半年多。上个月闲暇时间较多,我决定将其重新启用。恰逢落网电台进行了改版,回忆起之前在树莓派论坛上看到有人用它来播放豆瓣音乐,便萌生了同样的想法。通过一番调试,终于实现了在树莓派上流畅播放落网电台音乐的功能,带来了全新的音乐享受体验。 ... [详细]
  • 在处理遗留数据库的映射时,反向工程是一个重要的初始步骤。由于实体模式已经在数据库系统中存在,Hibernate 提供了自动化工具来简化这一过程,帮助开发人员快速生成持久化类和映射文件。通过反向工程,可以显著提高开发效率并减少手动配置的错误。此外,该工具还支持对现有数据库结构进行分析,自动生成符合 Hibernate 规范的配置文件,从而加速项目的启动和开发周期。 ... [详细]
  • 在尝试为 Unity 编译一个简单的 Java 库时,运行 `ant jar` 命令后遇到了 Java I/O 异常。具体错误信息为“无法启动程序 ${aAPT},错误代码 2”,这通常表示指定的文件或目录不存在。此问题可能是由于环境配置不正确或路径设置有误导致的。建议检查相关路径和环境变量,确保所有依赖项都已正确安装和配置。 ... [详细]
  • 掌握Android UI设计:利用ZoomControls实现图片缩放功能
    本文介绍了如何在Android应用中通过使用ZoomControls组件来实现图片的缩放功能。ZoomControls提供了一种简单且直观的方式,让用户可以通过点击放大和缩小按钮来调整图片的显示大小。文章详细讲解了ZoomControls的基本用法、布局设置以及与ImageView的结合使用方法,适合初学者快速掌握Android UI设计中的这一重要功能。 ... [详细]
  • 技术分享:深入解析GestureDetector手势识别机制
    技术分享:深入解析GestureDetector手势识别机制 ... [详细]
  • 开发笔记:深入解析Android自定义控件——Button的72种变形技巧
    开发笔记:深入解析Android自定义控件——Button的72种变形技巧 ... [详细]
  • VC维在机器学习中的应用与解析
    VC维在机器学习中的应用与解析VC维是指在机器学习中,一个假设空间能够正确分类的最大样本数量。具体而言,如果一个假设空间能够将N个样本以所有可能的 \(2^N\) 种方式完全分开,则称该假设空间具有N的VC维。VC维是衡量模型复杂度的重要指标,对于理解模型的泛化能力和过拟合风险具有重要意义。本文详细探讨了VC维的定义、计算方法及其在机器学习中的应用,并通过实例分析展示了其在模型选择和评估中的关键作用。 ... [详细]
  • C++入门必备:首个博客知识点汇总
    本文总结了C++初学者需要掌握的关键知识点,特别强调了成员类型的区分。其中,protected成员与private成员在本类中的作用相同,但protected成员允许派生类的成员函数访问,而private成员则不允许。此外,文章还介绍了其他重要的C++基础概念,如类的构造函数、析构函数以及继承机制,为初学者提供了一个全面的学习指南。 ... [详细]
  • 本文全面解析了 gRPC 的基础知识与高级应用,从 helloworld.proto 文件入手,详细阐述了如何定义服务接口。例如,`Greeter` 服务中的 `SayHello` 方法,该方法在客户端和服务器端的消息交互中起到了关键作用。通过实例代码,读者可以深入了解 gRPC 的工作原理及其在实际项目中的应用。 ... [详细]
  • 在搭建Hadoop集群以处理大规模数据存储和频繁读取需求的过程中,经常会遇到各种配置难题。本文总结了作者在实际部署中遇到的典型问题,并提供了详细的解决方案,帮助读者避免常见的配置陷阱。通过这些经验分享,希望读者能够更加顺利地完成Hadoop集群的搭建和配置。 ... [详细]
  • 在Maven项目中,高效地切换数据存储库是一项常见的需求。本文介绍了如何通过配置POM文件和使用 profiles 来实现不同环境下的数据存储库切换,确保开发、测试和生产环境的一致性和灵活性。此外,还探讨了最佳实践和常见问题的解决方案,帮助开发者提高工作效率和代码质量。 ... [详细]
  • Go 项目中数据库配置文件的优化与应用 ... [详细]
  • Hadoop 2.6 主要由 HDFS 和 YARN 两大部分组成,其中 YARN 包含了运行在 ResourceManager 的 JVM 中的组件以及在 NodeManager 中运行的部分。本文深入探讨了 Hadoop 2.6 日志文件的解析方法,并详细介绍了 MapReduce 日志管理的最佳实践,旨在帮助用户更好地理解和优化日志处理流程,提高系统运维效率。 ... [详细]
  • 手机号码归属地查询服务由 WebXml.com.cn 提供,通过其 WEB 服务接口(http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx)实现。该服务能够准确解析国内手机号码的归属地信息,适用于多种应用场景,如用户身份验证、市场分析等。 ... [详细]
author-avatar
凝笙儿
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有