countdowntimer的用法_offset counta函数

countdowntimer的用法_offset counta函数CountDownTimer类介绍CountDownTimer类比较简单,总共就一个构造和4个方法。内部是通过handler实现CountDownTimer(longtime,longinterval):参数time是总时间,interval是间隔时间start():开始倒计时的方法cancel():取消倒计时的方法onTink(longtime):抽象方法,每个间隔时间

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

CountDownTimer类介绍

CountDownTimer类比较简单,总共就一个构造和4个方法。内部是通过handler实现

CountDownTimer(long time,long interval):参数time是总时间,interval是间隔时间

start():开始倒计时的方法

cancel():取消倒计时的方法

onTink(long time):抽象方法,每个间隔时间一到就会调用一次,需要自己实现。参数time是指剩下的时间

onFinish():抽象方法,倒计时完成的方法

CountDownTimer示例

效果图

这里写图片描述

主要代码MainActivity.java

public class MainActivity extends Activity { 
   
    private TextView textView;
    private MyCountDownTimer timer;
    private final long TIME = 5 * 1000L;
    private final long INTERVAL = 1000L;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = (TextView) findViewById(R.id.tv);
        textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startTimer();
            }
        });
    }

    private class MyCountDownTimer extends CountDownTimer{ 
   

        public MyCountDownTimer(long millisInFuture, long countDownInterval) {
            super(millisInFuture, countDownInterval);
        }

        @Override
        public void onTick(long l) {
            long time = l / 1000;
            textView.setEnabled(false);
            textView.setText(time+"秒");
        }

        @Override
        public void onFinish() {
            textView.setEnabled(true);
            textView.setText("重新发送");
            cancelTimer();
        }
    }

    /** * 开始倒计时 */
    private void startTimer() {
        if (timer == null) {
            timer = new MyCountDownTimer(TIME, INTERVAL);
        }
        timer.start();
    }

    /** * 取消倒计时 */
    private void cancelTimer() {
        if (timer != null) {
            timer.cancel();
            timer = null;
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        cancelTimer();
    }

}

存在的问题

CountDownTimer如果使用不当,常常会报空指针异常,甚至造成严重的内存泄漏

CountDownTimer的内部实现是采用Handler机制,通过sendMessageDelayed延迟发送一条message到主线程的looper中,然后在自身中收到之后判断剩余时间,并发出相关回调,然后再次发出message的方式

这样的方式其实是有一定弊端的,那就是如果在Activity或者Fragment被回收时并未调用CountDownTimer的cancel()方法结束自己,这个时候CountDownTimer的Handler方法中如果判断到当前的时间未走完,那么会继续调用

sendMessageDelayed(obtainMessage(MSG), delay);

触发

onTick(millisLeft);

当回调了Activity或者fragment中CountDownTimer的onTick方法时,Activity或者Fragment已经被系统回收,从而里面的变量被设置为Null,再调用

textView.setText(time+”秒”);

textView为空,也就空指针了

同时,CountDownTimer中的Handler方法还在继续执行,这一块空间始终无法被系统回收也就造成了内存泄漏问题

总结

1、在CountDownTimer的onTick方法中记得判空

activity中
    if(MainActivity.this.isFinishing()){
        //doing something...
    }

fragment中
    if(getActivity()!=null){
       //doing something...
    }

2、在配合DialogFragment使用时,如果在onFinish()方法调用了 dismiss()方法让弹框消失,记得 判断getFragmentManager是否为空

@Override
    public void onFinish() {
        if(getFragmentManager()!=null){
            dismiss();
        }
    }

3、在使用CountDownTimer时,在宿主Activity或fragment生命周期结束的时候,记得调用timer.cancle()方法

@Override
    public void onDestroy() {
        if(timer!=null){
            timer.cancel();
            timer = null;
        }
        super.onDestroy();
    }

源码下载

限于篇幅,只放了MainActivity的代码

布局是一个TextView,背景和文字通过设置selector来实现可点和不可点的效果

戳以下链接下载源码

http://download.csdn.net/download/u010356768/10243971

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/192178.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 大数据的两种处理方式是什么_大数据的基本处理模式

    大数据的两种处理方式是什么_大数据的基本处理模式大数据的处理方式有两种:基于内存的流式处理和基于硬盘的存储处理。流式处理就好象是在经过的数据面前建一道水闸。数据流过这里,经过闸门的时候,就进行筛选过滤,分析出有价值的内容,然后丢弃,以后也不再使用

  • java 长轮询_java – Spring中的长轮询[通俗易懂]

    java 长轮询_java – Spring中的长轮询[通俗易懂]我们有一个独特的案例,我们需要与外部API接口,这需要我们长时间轮询他们的端点以获得他们所谓的实时事件.问题是我们可能有多达80,000人/设备在任何给定时间点击此端点,监听事件,每个设备/人1个连接.当客户端从我们的Spring服务发出请求以对事件进行长轮询时,我们的服务随后会对外部API进行异步调用以对事件进行长轮询.外部API已定义最小长轮询超时可设置为180秒.所以在这里我们遇到一个带队列…

    2022年10月14日
  • 相机标定——张正友棋盘格标定法

    相机标定——张正友棋盘格标定法目录为什么需要相机标定?相机标定可以做什么?相机标定后可以得到什么?什么情况下需要借助相机标定的方法?相机标定的原理实现相机标定的方法 为什么需要相机标定? 一个是由于每个镜头的在生产和组装过程中的畸变程度各不相同,通过相机标定可以校正这种镜头畸变,生成矫正后的图像——矫正透镜畸变; 另一个是根据标定后的到的相机参数建立相机成像几何模型,由获得的图像重构…

  • hql删除mysql语句_hibernate — HQL语句总结

    hql删除mysql语句_hibernate — HQL语句总结本章介绍了Hibernate的几种主要检索方式:HQL检索方式、QBC检索方式、SQL检索方式。HQL是HibernateQueryLanguage的缩写,是官方推荐的查询语言。QBC是QueryByCriteria的缩写,是Hibernate提供的一个查询接口。Hibernate是一个轻量级的框架,它允许使用原始SQL语句查询数据库。1.1HQL基础HQL是Hiberante官方推荐的…

  • 喊山第二部_demjanov重排

    喊山第二部_demjanov重排原题链接喊山,是人双手围在嘴边成喇叭状,对着远方高山发出“喂—喂喂—喂喂喂……”的呼唤。呼唤声通过空气的传递,回荡于深谷之间,传送到人们耳中,发出约定俗成的“讯号”,达到声讯传递交流的目的。原来它是彝族先民用来求援呼救的“讯号”,慢慢地人们在生活实践中发现了它的实用价值,便把它作为一种交流工具世代传袭使用。(图文摘自:http://news.xrxxw.com/newsshow-8018.html)一个山头呼喊的声音可以被临近的山头同时听到。题目假设每个山头最多有两个能听到它的临近山头。给定任意一个发

  • Java学习之集合篇

    Java学习之集合篇0x00前言上篇文章的常用类,其实就已经讲到了,这个ArrayList集合,但是ArrayList只是集合中的其中一种,那这篇文章就来讲讲关于集合的一些对象。0x01集合

    2021年12月12日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号