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) 指定多少毫秒之后发送消息

实例:

布局文件==》
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="horizontal"
tools:context=".MainActivity" > <ImageView
android:id="@+id/imgVTest"
android:layout_width="wrap_content"
android:layout_height="wrap_content" /> </LinearLayout> 代码实现==》
package com.example.myhandler; import java.util.Timer;
import java.util.TimerTask; import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.Menu;
import android.widget.ImageView; public class MainActivity extends Activity
{
int[] Images = new int[] { R.drawable.one, R.drawable.two, R.drawable.three, R.drawable.four,
R.drawable.five, R.drawable.six };
int CurrentImageId = 0; @Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); final ImageView img = (ImageView) this.findViewById(R.id.imgVTest);
         //主线程处理消息
final Handler handler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
if (msg.what == 1)
{
img.setImageResource(Images[CurrentImageId++]);
if (CurrentImageId >= 6)
{
CurrentImageId = 0;
}
}
// super.handleMessage(msg);
}
};
// 定义计时器,让计时器周期性的执行任务,新线程发送消息
new Timer().schedule(new TimerTask()//启动新线程
{
@Override
public void run()
{
Message msg = new Message();
msg.what = 1;
handler.sendMessage(msg);
}
}, 0, 1000);
} @Override
public boolean onCreateOptionsMenu(Menu menu)
{
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} }

实现效果: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. 对UICollectionView的学习

    UICollectionView 和 UICollectionViewController 类是iOS6 新引进的API,用于展示集合视图,布局更加灵活,可实现多列布局,用法类似于UITableVie ...

  2. localhost 和 127.0.0.1 的区别

    很多人会接触到这个ip地址127.0.0.1.也许你会问127.0.0.1是什么地址?其实127.0.0.1是一个回送地址,指本地机,一般用来测试使用.大家常用来ping 127.0.0.1来看本地i ...

  3. String的常规使用集合

    今天先附上代码君: package com.jacob.javase; import java.io.UnsupportedEncodingException; /* *探讨String:  *  * ...

  4. Codeforces Round #366 (Div. 2) A

    A. Hulk time limit per test 1 second memory limit per test 256 megabytes input standard input output ...

  5. poj 3468 线段树区间更新/查询

    Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...

  6. mysql数据库主从复制部署笔记

    主从复制是mysql中数据库实时同步的一个常用做法了,今天我来给各位介绍一下关于mysql数据库主从复制部署一个过程,希望此例子对各位同学参考参考. 数据库主从复制原理: 数据库的主从复制就是从mas ...

  7. 越狱Season 1-Episode 11: And Then There Were 7-M

    Season 1, Episode 11: And Then There Were 7-M -Michael: That one 那个 -businessman: Nice choice choice ...

  8. 【BZOJ2013】【JSOI2008】球形空间产生器

    看chty代码 原题: BZOJ挂了--等好了补上题面 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这 ...

  9. 【BZOJ1010】【HNOI2008】玩具装箱

    继续看黄学长代码 原题: P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1.. ...

  10. kuangbin_ShortPath M (POJ 1062)

    提出了一个错误的算法 以为能优化到只运行两次dij 然而我还是too naive 还是乖乖dij n 次吧... #include <iostream> #include <stri ...