Android常见的倒计时和延迟的几种方式

前言

在日常的开发过程中经常会需要用到倒计时或者延时。前段时间的有一个延迟自动关闭dialog的需求,进度条需要等待一会才会到达100%,当时我直接

···
Thread.sleep(3000);
dismiss();
···

,这样子并没有达到我要的等待的效果,而且还可能造成主线程阻塞,真是无知啊。这篇博客也写一下倒计时和延时常用的方式吧,作为一个学习笔记。本篇博客写了三种倒计时的方式。

效果图

在这里插入图片描述

Handler 实现倒计时

        handlerButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                bootNextTime = 11;
                UIHandler.sendEmptyMessage(1);
            }
        });
        
        ···
    private int bootNextTime = 11;
    private Timer timer;
    private Handler UIHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            Log.d(TAG, "msg.what=" + msg.what);
            switch (msg.what) {
                case 1:
                    bootNextTime--;
                    mTextView.setText("正在设置倒计时关机,请在 " + bootNextTime + "s 内不要断开电源 !!!");
                    if (bootNextTime > 0) {
                        sendEmptyMessageDelayed(1, 1000);
                    } else {
                        mTextView.setText("倒计时关机已设置完成!");
                    }
                    break;   

首先我们用UIHandler.sendEmptyMessage(1);去启动UIHandler,然后在handleMessage方法里面每隔一秒给自己发一次sendEmptyMessageDelayed(1, 1000); 一直到倒计时时10秒。

Timer + handler 实现倒计时

        mTimerButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                bootNextTime = 11;
                bootNextTime--;
                TimerTask timerTask = new TimerTask() {
                    @Override
                    public void run() {
                        UIHandler.sendEmptyMessage(2);
                    }
                };
                timer = new Timer();
                timer.schedule(timerTask, 0, 1000);

            }
        });
        ···
            case 2:
                bootNextTime--;
                mTextView.setText("正在设置倒计时关机,请在 " + bootNextTime + "s 内不要断开电源 !!!");
                if (bootNextTime == 0) {
                        mTextView.setText("倒计时关机已设置完成!");
                        timer.cancel();
                    }
                    break;

timer.schedule(timerTask, 0, 1000); 每隔一秒会执行一次,我们在UIHandler中根据bootNextTime的值来判断倒计时的此时,并且要注意timer.cancel();取消timer。

HandlerThread+runOnUiThread方式

如果没有耗时操作是不需要用到子线程的,这面还是列出来。
首先定义HandlerThread

private HandlerThread handlerThread;

然后onCreate中初始化HandlerThread 和 workhandler

handlerThread = new HandlerThread(“倒计时”);
handlerThread.start();
initHandler();

initHandler() 的 方法如下,将handlerThread 的looper传给这个handler 用于处理耗时操作,当然这里其实没有耗时操作,子线程更新UI 可以用UIHandler.postrunOnUiThread

    private void initHandler() {
       //子线程
       workHandler = new Handler(handlerThread.getLooper()) {
           @Override
           public void handleMessage(final Message msg) {
               switch (msg.what) {
                   case 1:
                       //
                       bootNextTime--;
                       UIHandler.post(new Runnable() {
                           @Override
                           public void run() {
                               mTextView.setText("正在设置倒计时关机,请在 " + bootNextTime + "s 内不要断开电源 !!!");
                           }
                       });

                       if (bootNextTime > 0) {
                           removeMessages(1);
                           sendEmptyMessageDelayed(1, 1000);
                       }else {
                           runOnUiThread(new Runnable() {
                               @Override
                               public void run() {
                                   mTextView.setText("倒计时关机已设置完成!");
                               }
                           });
                       }
                       break;
               }

           }
       };
   }

几种方式的优缺点

一个简单的表格是这么创建的:

项目Value
电脑$1600
手机$12
导管$1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列第二列第三列
第一列文本居中第二列文本居右第三列文本居左

SmartyPants

SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

TYPEASCIIHTML
Single backticks'Isn't this fun?'‘Isn’t this fun?’
Quotes"Isn't this fun?"“Isn’t this fun?”
Dashes-- is en-dash, --- is em-dash– is en-dash, — is em-dash

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件或者.html文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mrsongs的心情杂货铺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值