“阶段一”是指我第一次系统地学习Android开发。这主要是对我的学习过程作个记录。

本来是打算继续做天气预报的优化的,但因为某些原因,我要先把之前做的小应用优化一下。所以今天就插播一下用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方法创建的

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

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

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

    本来是打算继续做天气预报的优化的,但因为某些原因,我要先把之前做的小应用优化一下.所以今天就插播一下用Handler和Message实现计时效果. 首先,简要说明一下,这个应用有两个显示数字的Text ...

  2. Android之消息机制Handler,Looper,Message解析

    PS:由于感冒原因,本篇写的有点没有主干,大家凑合看吧.. 学习内容: 1.MessageQueue,Looper,MessageQueue的作用. 2.子线程向主线程中发送消息 3.主线程向子线程中 ...

  3. 转载《Android Handler、Message》

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

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

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

  5. 【Android 开发】: Android 消息处理机制之一: Handler 与 Message

    最近几讲内容,我们学习了Android中关于多线程的一些知识,上一讲我们讲解了异步任务 AsyncTask 的操作,Android中还提供了其他的线程操作,如Handler Message Messa ...

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

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

  7. Android Bundle、Handler和Message类介绍

    Bundle是一个载体,可以存放基本数据类型.对象等内容,相当于一辆汽车,可以装载很多东西,然后运到需要的地方,例如: Bundle mBundle=new Bundle(); mBundle.put ...

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

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

  9. Android的消息处理机制,handler,message,looper(一)

    当应用程序启动时,Android首先会开启一个主线程(也就是UI线程),主线程为管理界面中的UI控件.在程序开发时,对于比较耗时的操作,通常会为其开辟一个单独的线程来执行,以尽可能减少用户的等待时间. ...

随机推荐

  1. 如何使用RobotFramework编写好的测试用例

    如何使用Robot Framework编写优秀的测试用例 概述 命名 测试套件命名 测试用例命名 关键字命名 setup和teardown的命名 文档 测试套件文档 测试用例文档 用户关键字文档 测试 ...

  2. Microsoft Azure Web Sites应用与实践【4】—— Microsoft Azure网站的“后门”

    Microsoft Azure Web Sites应用与实践 系列: [1]—— 打造你的第一个Microsoft Azure Website [2]—— 通过本地IIS 远程管理Microsoft ...

  3. C#开源实现MJPEG流传输

    本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 许久以前写了篇文章<基于.NET打造IP智能网络视频监控系统>,记录和介绍了自己几年来积 ...

  4. [数据库基础]——图解JOIN

    阅读导航 一.概要 二.JOIN分类 三.JOIN分类详解 一.概要 JOIN对于接触过数据库的人,这个词都不陌生,而且很多人很清楚各种JOIN,还有很多人对这个理解也不是很透彻,这次就说说JOIN操 ...

  5. ASP.NET Web API WebHost宿主环境中管道、路由

    ASP.NET Web API WebHost宿主环境中管道.路由 前言 上篇中说到ASP.NET Web API框架在SelfHost环境中管道.路由的一个形态,本篇就来说明一下在WebHost环境 ...

  6. pod Spec管理配置

    pod Spec 为自己的项目添加pod管理功能.前言: 上一篇文章中提到,因为自己在操作的时候遇到很多坑,所在在此做一个记录,同样也希望可以帮到在这个操作上遇到坑的人. 本文将采用配图和加文字的方式 ...

  7. 将WordPress安装在网站子目录的相关问题

    May182013 将WordPress安装在网站子目录的相关问题 作者:xieyc   发布:2013-05-18 00:11   字符数:3423   分类:站长   阅读: 12,054 次   ...

  8. 特殊的数据类型: bit、sql_variant、sysname

    在SQL Server中,特殊的数据类型主要有三个,分别是:bit.sql_variant 和 sysname 一,bit bit类型,只有三个有效值:0,1 和 null,字符串true或false ...

  9. 【.NET深呼吸】应用上下文(AppContext)

    在.net 4.6中新增了一个类,叫AppContext,这个家伙嘛,技术含量不算高,只不过是在编程的时候可以方便用用而已.应用上下文允许定义一个标识(用字符串表示),并且在应用程序运行期间可以切换状 ...

  10. html5中canvas的使用 获取鼠标点击页面上某点的RGB

    1.html5中的canvas在IE9中可以跑起来.在IE8则跑不起来,这时候就需要一些东西了. 我推荐这种方法,这样显得代码不乱. <!--[if lt IE9]> <script ...