本来是打算继续做天气预报的优化的,但因为某些原因,我要先把之前做的小应用优化一下。所以今天就插播一下用Handler和Message实现计时效果。

首先,简要说明一下,这个应用有两个显示数字的Text,一个是显示秒,另一个是显示毫秒,而每10毫秒发送一次Message,让显示毫秒的Text加1,每1000毫秒,也就一秒,就让显示秒的Text加1。此外,还有一个自己制作的圆形进度条,每过一秒会增加6度的弧。这个应用有开始、暂停、重置功能。就是下图这样子:

一、sendMessage、handleMessage实现跑秒,removeMessages实现暂停

主要流程是下图这样的:

说明:

(1)sendMessage都是延迟发送,也就是sendMessageDelayed。

(2)invalidate是刷新视图,用来刷新上面提到的圆形进度条。

详细来讲,就是单击开始按钮,发送第一个Message,然后传到handleMessage中处理,之后便在handleMessage中循环发送Message并处理。而当点击暂停按钮时,就会清除掉消息队列中的消息,也就打破了循环。

接下来,详细讲讲Message的处理流程这部分,如下图:

说明:

(1)当有message发送来时,并不会直接添加到MessageQueue中,它需要Looper和Handler对象一起作用,才会添加进去。另外,MessageQueue中的Message是由Looper派遣出去的。

(2)根据(1)知道,要处理message,必须要有Looper。所以在其它线程执行handleMessage时,必须要创建Looper。因为除了主线程默认有Looper之外,其它线程都是没有的。而每一个Handler实例都会和一个线程和这个线程的MessageQueue关联起来。

(3)当要在handleMessage里面发送message时,是通过Message.obtain方法获取message对象,这方法是从一个叫公共信息池的地方获取对象的,我的感觉是,这里的对象就是接收到的message。

(4)在上一张图中,暂停就是调用removeMessages方法。移除掉的就是在MessageQueue中的message。

我想讲的主要就是上面的那些,以下是开始的那个流程图的代码,:

效果图,只能是静态的:

二、一些疑问

(1)这里的Handler是一个静态类,老师提倡这么写。我之前是这样写的:

但其实,这么写Android Studio已经有提示了

我能理解到的就是,如果在主线程中Handler使用Looper或者MessageQueue时,就需要声明Handler为静态类,还有要用上WeakReference弱引用,这么做是为了便于回收。具体是怎样的,还需深入学习。

(2)用new传入Context的方法创建CircularView(自定义View)的对象,能调用CircularView类的公有方法并修改了其中的成员变量,但就是不能成功调用invalidate刷新方法。

构造方法是按老师教的修改,但老师并没有演示这样做。构造方法如下图:

通过打Log输出(图没贴上来),可以知道的确成功调用了自定义View类CircularView中的方法。

但当我通过findViewById的方法来创建对象时,不仅能调用CircularView类的公有方法并修改了其中的成员变量,还能成功调用invalidate方法。

对此,我就输出它们俩的对象,看一下,如下图:

这是通过findViewById的方法来创建的

这是通过new传入Context方法创建的

发现它们创建的对象原来是不一样的。我也只能研究到这一步了,所以要深入学习的还有很多啊!

Android 用Handler和Message实现计时效果及其中一些疑问的更多相关文章

  1. 阶段一:用Handler和Message实现计时效果及其中一些疑问

    “阶段一”是指我第一次系统地学习Android开发.这主要是对我的学习过程作个记录. 本来是打算继续做天气预报的优化的,但因为某些原因,我要先把之前做的小应用优化一下.所以今天就插播一下用Handle ...

  2. android 利用Handler触发另一个activity方法

    如activityA代码: activityB = new ActivtyB(mHandler,CLOSE_SEARCH_MSG);//新建对像B传递,一个handler和Message,然后在act ...

  3. 转载《Android Handler、Message》

    之前也是由于周末通宵看TI3比赛,一直没找到时间写博客,导致已经有好久没更新了.惭愧!后面还会恢复进度,尽量保证每周都写吧.这里也是先恭喜一下来自瑞典的Alliance战队夺得了TI3的冠军,希望明年 ...

  4. Android开发学习之路-使用Handler和Message更新UI

    在Android中,在非主线程中更新UI控件是不安全的,app在运行时会直接Crash,所以当我们需要在非主线程中更新UI控件,那么就需要用到Handler和Message来实现 Demo中,使用到一 ...

  5. Android消息处理机制(Handler 与Message)---01

    一.handler的使用场景为么会有handler?(部分内容图片摘自http://www.runoob.com/w3cnote/android-tutorial-handler-message.ht ...

  6. android的消息处理有三个核心类:Looper,Handler和Message。

    android的消息处理机制(图+源码分析)——Looper,Handler,Message   作为 一名android程序员,我学习android的一大乐趣是可以通过源码学习google大牛们的设 ...

  7. Android的消息处理机制(Looper,Handler,Message)(转)

    Handler Handler的定义: 主要接收子线程发送的数据,并用此数据配合主线程更新UI. 当应用程序启动时,Android首先会开启一个主线程(也就是UI线程),主线程为管理界面中的UI空间进 ...

  8. Android开发学习之路--异步消息Handler,Message,Looper和AsyncTask之初体验

    在简易音乐播放器中,用了Handler,也没有过多地去研究学习,这里再学习下android下的异步消息处理机制.这里用了Handler主要是在线程中不能更新UI,而需要通过Handler才可以.关于异 ...

  9. android线程 Handler Message Queue AsyncTask线程模型 线程交互 + 修改Button样式 示例 最终easy整合版

     首先原谅我把文章的标题写的这么长.其实我还嫌弃它短了因为 写不下去了所以我就不写了.因为我实在不知道该怎么定义这篇文章的标题或许应该叫 "乱谈"比较合适. 这样可能还体现了 ...

随机推荐

  1. mac nwjs入门

    NW.js由node-webkit项目发展而来其实很多东西官网上都有.但是鉴于搜索引擎(百度,google)搜索到的相关文章,让人看的很不明白.所以决定写下此篇文章. 官网:https://nwjs. ...

  2. 关于java中的继承

    我们都知道Java中的继承是复用代码.扩展子类的一种方式,继承使得Java中重复的代码能够被提取出来供子类共用,对于Java程序的性能以及修改和扩展有很大的意义,所以这是一个非常重要的知识点. 那么对 ...

  3. 【剑指Offer】59、按之字形顺序打印二叉树

      题目描述:   请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推.   解题思路:   这道题仍然是二 ...

  4. Linux基础:uniq命令总结

    本文只总结一些常用的用法,更详细的说明见man uniq和 uniq --help. uniq命令 uniq命令主要用于去重. 需要注意的是,不相邻的行不算重复值. 语法格式 Usage: uniq ...

  5. ES6中的Symbol

    ---恢复内容开始--- Symbol 1.1 概述 保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突.这就是 ES6 引入Symbol的原因 在es6之前,JavaScript ...

  6. SQL中的条件判断语句(case when zhen if,ifnull)用法

    简介: case具有两种格式.简单case函数和case搜索函数.这两种方式,可以实现相同的功能.简单case函数的写法相对比较简洁,但是和case搜索函数相比,功能方面会有些限制,比如写判定式.还有 ...

  7. CentOS平滑更新nginx版本

    目前使用的nginx版本是1.4.4,平滑升级到nginx1.10.1,具体升级操作流程如下: 1.备份当前使用的nginx程序目录 tar -zcvf ./nginx1.4.4bak.tar.gz ...

  8. _markupbase.py if not match: UnboundLocalError: local variable 'match' referenced before assignment,分析Python 库 html.parser 中存在的一个解析BUG

    BUG触发时的完整报错内容(本地无关路径用已经用 **** 隐去): **************\lib\site-packages\bs4\builder\_htmlparser.py:78: U ...

  9. Django链接Mysql 8.0 出现错误(1045:Access denied for user 'root'@'localhost' (using password: NO) 的一种解决方法

    运行环境: Django版本2.0 ; Mysql 版本 8.0.11; 错误代码:  django.db.utils.OperationalError: (1045:Access denied fo ...

  10. laravel5 文件上传

    <!DOCTYPE html><html lang="zh-CN"><head> {{--设置字符编码--}} <meta charset ...