android 定时器的实现比较

android 定时器的实现比较第一种,Handler+threadpublicclassMainActivityextendsActivity{TextViewtextView;inttime;Handlerhandler=newHandler(){@OverridepublicvoidhandleMessage(Messag

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

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

第一种,Handler+ thread

public class MainActivity extends Activity {

    TextView textView;
    int time;
    Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            textView.setText(msg.arg1 + "");
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.test_time);
        textView.setText(time + "");
        new Thread() {
            @Override
            public void run() {
                int times = 0;
                while (true) {
                    try {
                        Thread.sleep(1000);
                        Message message = new Message();
                        message.arg1 = times;
                        times++;
                        handler.sendMessage(message);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
    }

这种明显的是使用了另外一个线程,在android开发中,速度是很重要的,开启线程都是需要进行消耗大量资源的,android不必web,他的资源有限,所以我们在不必要的时候,不要开启线程,结果是:

android 定时器的实现比较

结果很简单

第二种:Handler + postDelyed  

TextView textView;
    int time = 1000;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.test_time);

        System.out.println("Main  Name : "
                + Thread.currentThread().getName());
        handler.postDelayed(runnable, time);
    }

    Handler handler = new Handler();

    Runnable runnable = new Runnable() {
        int i = 0;

        @Override
        public void run() {
            System.out.println("Name : "
                    + Thread.currentThread().getName());
            textView.setText(i + "");
            handler.postDelayed(this, time);
            i++;
        }
    };

结果打印如下:

android 定时器的实现比较
可以看出,这种的定时效果是在主线程中的并且实在MessageQuence中进行实现的:

 needWake = mBlocked && p.target == null && msg.isAsynchronous();
                Message prev;
                for (;;) {
                    prev = p;
                    p = p.next;
                    if (p == null || when < p.when) {
                        break;
                    }
                    if (needWake && p.isAsynchronous()) {
                        needWake = false;
                    }
                }
                msg.next = p; // invariant: p == prev.next
                prev.next = msg;
            }

这是android的源码,他确实没有启动线程

第三种:Handler+Timer+TimerTask

TextView textView;
    int time = 10000;
    int i;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.test_time);

        System.out.println("Main  Name : "
                + Thread.currentThread().getName());
//        handler.postDelayed(runnable, time);

        timer.schedule(timerTask,0,10000);

    }


    Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            textView.setText(i++ + "");
        }
    };

    Timer timer = new Timer();
    TimerTask timerTask = new TimerTask() {
        @Override
        public void run() {
            System.out.println("Name : "
                    + Thread.currentThread().getName());
            Message message = new Message();
            handler.sendMessage(message);
        }
    };

打印图:

android 定时器的实现比较

可以看出,这个也是自己启动了一个线程,实在线程中进行定时的

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/160058.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 史上MySQL安装配置教程最细,一步一图解

    史上MySQL安装配置教程最细,一步一图解一、下载MySQLMysql官网下载地址:https://downloads.mysql.com/archives/installer/1.选择要安装的版本,本篇文章选择的是5.7.31版本,点击Download下载二、安装MySQL1.选择设置类型双击运行mysql-installer-community-5.7.31.0.msi这里选择是自定义安装,所以直接选择“Custom”,点击“Next”“DeveloperDefault”是开发者默认 “Server

    2022年5月28日
    49
  • Java文件上传详解

    Java文件上传详解Java文件上传详解文件上传和下载准备工作使用类介绍代码编写文件上传和下载在Web应用中,文件上传和下载功能是非常常用的功能,这篇博客就来讲一下JavaWeb中的文件上传和下载功能的实现。准备工作对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的。一般选择采用apache的开源工具common-fileupload这个文件上传组件。common-fileupload是依赖于common-io这个包的,所以还需要下载这个包。首先下载最新的jar包https://mvnr

    2022年5月14日
    41
  • Windows下的免安装版MySQL配置「建议收藏」

    Windows下的免安装版MySQL配置「建议收藏」近日在新的电脑上安装MySQL遇到一些小问题,在此做分享,也作为日后备用。下载MySQL进入MySQL官网,依次点击:上方选项卡DOWNLOADS-&gt;页面底端MySQLCommunityEdition-&gt;MySQLCommunityServer,此时会来到以下这个页面:下载红色框选中的项目,是个压缩包。下载完毕后直接解压,可以开始配置。建议保存的路径不要有中文,…

    2022年6月6日
    34
  • python 字符串转16进制数字

    1原始文件中的字符串2读取文件字符串从文件中读取2个字节,代码如下:defprint_hex_str(str1):printlen(str1)printstr1printint(str1,16)foriinstr1:print"——–"print(‘%#X’%ord(i))print…

    2022年4月18日
    620
  • 个人网站开发流程(网站开发的工作流程图)

    1.确定主题选择主题应该是小而精,目标定位要小,内容要精。不要去试图制作一个包罗万象的站点,这往往会失去网站的特色,也会带来高强度的劳动,给网站的及时更新带来困难。一定记住,在互联网只有第一,没有第二。2.选择域名在互联网世界中,域名就是网站的名字。一个好记,易记得域名会给个人网站加分,当积累了一定的用户的人气的个人网站,域名的价值就会体现出来。3.学习网页设计和开发技术对于常…

    2022年4月14日
    44
  • Java中的对象数组「建议收藏」

    Java中的对象数组「建议收藏」Java对象数组在创建后,基本数据类型数组可以直接对数组元素赋值、引用等操作;而自定义对象数组,需要对数组中的每个对象元素独立进行创建,然后才可以对其赋值、引用等操作,如果没有单独对每个对象元素创建,会导致空指针异常1.基本数据类型数组数组都要先声明、再创建后使用。基本数据类型数组的声明有以下几种格式(以int类型为例):①int[]array;②int[]array=newint;③in…

    2022年7月16日
    15

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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