Handler消息传递机制

==》

android消息机制是另一种形式的“事件处理”,这种机制主要是为了解决android应用的多线程问题。

——android平台不允许Activity新启动的线程访问该Activity里的界面组件,这样就导致新启动的线程无法动态改变界面组件的值。

但实际android应用开发中,尤其是涉及动画游戏开发中,需要让新启动的线程周期性地改变界面组件的值,就需要借助Handler消息传递机制处理。

Handler类的主要作用:

  1.在新启动的线程中发送消息;

  2.在主线程中获取、处理消息;

注意:

为了能让主线程“适时”地处理新启动的线程所发送的消息,只能通过回调的方式来实现——只需要重写Handler类中处理消息的方法,当新启动的线程发送消息时,

Handler类中处理消息的方法将被自动回调。

Handler类包含如下方法用于发送、处理消息:

void handleMessage(Message msg) 处理消息的方法,该方法通常用于被重写
final boolean hasMessage(int what)   检查消息队列中是否包含what属性为指定值的消息
final boolean hasMessage(int what,Object obj) 检查消息队列中是否包含what属性为指定值的消息并且obj对象为指定对象的消息
多个重载的Message obtainMessage(int what) 获取消息
sendEmptyMessage(int what) 发送空消息
final boolean sendEmptyMessageDelayed(int what,long delayMillis) 指定多少毫秒之后发送空消息
final boolean sendMessage(Message msg) 立即发送消息
final boolean sendMessageDelayed(Message msg,long delayMillis) 指定多少毫秒之后发送消息

实例:

  1. 布局文件==》
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. android:gravity="center"
  7. android:orientation="horizontal"
  8. tools:context=".MainActivity" >
  9.  
  10. <ImageView
  11. android:id="@+id/imgVTest"
  12. android:layout_width="wrap_content"
  13. android:layout_height="wrap_content" />
  14.  
  15. </LinearLayout>
  16.  
  17. 代码实现==》
  18. package com.example.myhandler;
  19.  
  20. import java.util.Timer;
  21. import java.util.TimerTask;
  22.  
  23. import android.os.Bundle;
  24. import android.os.Handler;
  25. import android.os.Message;
  26. import android.app.Activity;
  27. import android.view.Menu;
  28. import android.widget.ImageView;
  29.  
  30. public class MainActivity extends Activity
  31. {
  32. int[] Images = new int[] { R.drawable.one, R.drawable.two, R.drawable.three, R.drawable.four,
  33. R.drawable.five, R.drawable.six };
  34. int CurrentImageId = 0;
  35.  
  36. @Override
  37. protected void onCreate(Bundle savedInstanceState)
  38. {
  39. super.onCreate(savedInstanceState);
  40. setContentView(R.layout.activity_main);
  41.  
  42. final ImageView img = (ImageView) this.findViewById(R.id.imgVTest);
             //主线程处理消息
  43. final Handler handler = new Handler()
  44. {
  45. @Override
  46. public void handleMessage(Message msg)
  47. {
  48. if (msg.what == 1)
  49. {
  50. img.setImageResource(Images[CurrentImageId++]);
  51. if (CurrentImageId >= 6)
  52. {
  53. CurrentImageId = 0;
  54. }
  55. }
  56. // super.handleMessage(msg);
  57. }
  58. };
  59. // 定义计时器,让计时器周期性的执行任务,新线程发送消息
  60. new Timer().schedule(new TimerTask()//启动新线程
  61. {
  62. @Override
  63. public void run()
  64. {
  65. Message msg = new Message();
  66. msg.what = 1;
  67. handler.sendMessage(msg);
  68. }
  69. }, 0, 1000);
  70. }
  71.  
  72. @Override
  73. public boolean onCreateOptionsMenu(Menu menu)
  74. {
  75. // Inflate the menu; this adds items to the action bar if it is present.
  76. getMenuInflater().inflate(R.menu.main, menu);
  77. return true;
  78. }
  79.  
  80. }

实现效果:6张图片实现动态切换展示效果

  .....

注意:Timer用于周期性的执行指定任务,Timer对象可调度TimerTask对象,TimerTask对象的本质就是启动一条新线程,由于android不运行在新线程中

访问Activity里的界面组件,因此程序只能在新线程里发送一条消息,通知系统更新组件(如上实例ImageView)。

android学习笔记25——事件处理Handler的更多相关文章

  1. android学习笔记24——事件处理

    事件处理 android提供了两种事件处理机制: 1.基于回调的事件处理 2.基于监听器的事件处理(通过绑定特定事件监听器) 注意: android对于基于回调的事件处理而言,主要做法就是重写andr ...

  2. 【转】 Pro Android学习笔记(八八):了解Handler(2):什么是Handler

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 之前我们有一篇很好的博文<Andro ...

  3. Android学习笔记之JSON数据解析

    转载:Android学习笔记44:JSON数据解析 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种 ...

  4. Android学习笔记36:使用SQLite方式存储数据

    在Android中一共提供了5种数据存储方式,分别为: (1)Files:通过FileInputStream和FileOutputStream对文件进行操作.具体使用方法可以参阅博文<Andro ...

  5. 【转】 Pro Android学习笔记(九二):AsyncTask(1):AsyncTask类

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在Handler的学习系列中,学习了如何h ...

  6. 【转】 Pro Android学习笔记(七四):HTTP服务(8):使用后台线程AsyncTask

    目录(?)[-] 5秒超时异常 AsyncTask 实现AsyncTask抽象类 对AsyncTask的调用 在哪里运行 其他重要method 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注 ...

  7. 六、Android学习第五天——Handler的使用(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 六.Android学习第五天——Handler的使用 注意:有很多功能是不 ...

  8. IOS学习笔记25—HTTP操作之ASIHTTPRequest

    IOS学习笔记25—HTTP操作之ASIHTTPRequest 分类: iOS2012-08-12 10:04 7734人阅读 评论(3) 收藏 举报 iosios5网络wrapper框架新浪微博 A ...

  9. Android 学习笔记之Volley(七)实现Json数据加载和解析...

    学习内容: 1.使用Volley实现异步加载Json数据...   Volley的第二大请求就是通过发送请求异步实现Json数据信息的加载,加载Json数据有两种方式,一种是通过获取Json对象,然后 ...

随机推荐

  1. python 的 class

    虽然python OOP 是可选的,但是尽可能使用OOP, 可以让你的代码更精简,容易理解. python 中大多数OOP故事, 都可简化为这个表达式: object.attribute 类的建立使用 ...

  2. (实用篇)微信网页授权(OAuth2.0) PHP 源码简单实现

    提要: 1. 建议对OAuth2.0协议做一个学习. 2. 微信官方文档和微信官网工具要得到充分利用. 比较简单,直接帖源代码了.其中"xxxxxxxxxx"部分,是需要依据自己环 ...

  3. HMTL—表单

    <body> <form> 账号:<input type="text" value="123" /> <br /> ...

  4. Java—面向对象—权限修饰符及思维导图

    课上老师所讲实例整理: package org.hanqi.pn0120; //汽车 public class Car { //颜色 private String yanse; //品牌 privat ...

  5. hdu5442(2015长春赛区网络赛1006)后缀数组+KMP /最小表示法?

    题意:给定一个由小写字母组成的长度为 n 的字符串,首尾相连,可以从任意一个字符开始,顺时针或逆时针取这个串(长度为 n),求一个字典序最大的字符串的开始字符位置和顺时针或逆时针.如果有多个字典序最大 ...

  6. MAC 如何修改PATH

    http://hathaway.cc/post/69201163472/how-to-edit-your-path-environment-variables-on-mac

  7. 转贴:sudo apt-get install 可以安装的一些软件

    Ubuntu 下的一些软件安装sudo apt-get install virtualbox#华主席推荐 2007年年度最佳软件,最佳编辑选择奖得主.....sudo apt-get install ...

  8. C中scanf/gets/fgets的区别

    功能:同样是获取字符串. 区别: scanf 遇到空格/回车/Tab键认为输入结束, 但是空格/回车/Tab键仍会留在输入的缓冲区中.常见的是使用getchar(),处理scanf的后事:如果想要清除 ...

  9. lua操作常用函数学习一

    (1)lua 和 C++之间的交互的基本知识: lua 和 C++ 之间的数据交互通过堆栈进行,栈中的数据通过索引值进行定位,(栈就像是一个容器一样,放进去的东西都要有标号)其中栈顶是-1,栈底是1, ...

  10. MySQL 日志管理详解

    大纲 一.日志分类 二.日志详解 注:MySQL版本,Mysql-5.5.32(不同版本的mysql变量有所不同) 一.日志分类 错误日志 查询日志 慢查询日志 二进制日志 中继日志 事务日志 滚动日 ...