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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/An_Times/article/details/83588407

前言

在日常的开发过程中经常会需要用到倒计时或者延时。前段时间的有一个延迟自动关闭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实体。例如:

TYPE ASCII HTML
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文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。

猜你喜欢

转载自blog.csdn.net/An_Times/article/details/83588407