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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • PHP面试题:HTTP中POST、GET、PUT、DELETE方式的区别

    PHP面试题:HTTP中POST、GET、PUT、DELETE方式的区别

    2021年10月12日
    52
  • 【linux】查看Linux系统版本信息的几种方法[通俗易懂]

    【linux】查看Linux系统版本信息的几种方法[通俗易懂]一、查看Linux内核版本命令(两种方法):1、cat/proc/version2、uname-a二、查看Linux系统版本的命令(3种方法):1、lsb_release-a,即可列出所有版本信息:这个命令适用于所有的Linux发行版,包括RedHat、SUSE、Debian…等发行版。2、cat/etc/redhat-release,这种方法只适合Redhat系的Linux:[root@S-CentOShome]#cat/etc/redhat-rele

    2025年11月30日
    7
  • 微信开放平台:微信扫码登录功能

    微信开放平台:微信扫码登录功能文章目录微信开放平台:微信扫码登录功能1.授权流程说明2.授权流程代码3.用户登录和登出微信开放平台:微信扫码登录功能官方文档:https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html1.授权流程说明微信OAuth2.0授权登录让微信用户使用微信身份安全登录第三方应用或网站,在微信用户授权登录已接入微信OAuth2.0的第三方应用后,第三方可以获取到用户的接口调用凭证(a

    2022年4月29日
    88
  • 【Java】Thread类中的join()方法原理

    【Java】Thread类中的join()方法原理简介join()是Thread类的一个方法。根据jdk文档的定义:publicfinalvoidjoin()throwsInterruptedException:Waitsforthisthreadtodie.join()方法的作用,是等待这个线程结束;但显然,这样的定义并不清晰。个人认为”Java7ConcurrencyCookbook”的定义较为…

    2022年5月27日
    51
  • 【MyBatis】 动态SQL——模糊查询 LIKE

    【MyBatis】 动态SQL——模糊查询 LIKE一、like’%?%’SELECT*FROMt_usrWHEREnamelike’%${name}%’SQL解析为:SELECT*FROMt_usrWHEREnamelike’%海%’传参必须用${}不能用#{},这样写的弊端是不安全,不能防sql注入有关LIKE使用,请参见:https://blog.csdn.net/wrs120/articl…

    2022年5月28日
    147
  • Python 编译器_如何在pe系统里安装软件

    Python 编译器_如何在pe系统里安装软件好久都没更新博客了,最近是真的很忙,每天抽出1小时写博客,有的时候更本没时间,今天写一个解析PE的一个软件,过程和内容很干,干货干货之前有很多人加我要资料和软件,我从来没说过要钱什么的,只要给个关注和点赞,就可以了,需要什么资料,只要我可以给,我会不要一分钱免费给你们资料,欢迎大家来评论博主?点个赞留个关注吧!!资料(百度网盘)提取码:i4ptPE解析软件和源代码包文件提取码:07bhPE解析器软件安装包提取码:r9og激活成功教程版打包软件–打包为安装包先看视频,双击打开

    2022年10月16日
    3

发表回复

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

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