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. 解决Android时时更新listview数组越界问题

    时时更新数据一般出现在金融.股票行业对数据的准确性要求极高情况下使用. 先来看看下面一段代码, public class MainActivity extends Activity { private ...

  2. 利用freemarker生成xml

    package com.mooc.freemarkerXML; import java.io.IOException; import java.io.StringWriter; import java ...

  3. C/C++程序员必须熟练应用的开源项目(转-清风小阁)

    作为一个经验丰富的C/C++程序员, 肯定亲手写过各种功能的代码, 比如封装过数据库访问的类, 封装过网络通信的类,封装过日志操作的类, 封装过文件访问的类, 封装过UI界面库等, 也在实际的项目中应 ...

  4. mysql5.6启动占用内存很大的解决方法

    vps的内存为512M,安装好nginx,php等启动起来,mysql死活启动不起来看了日志只看到对应pid被结束了,后跟踪看发现是内存不足被killed; 调整my.cnf 参数,重新配置(系统默认 ...

  5. 越狱Season 1-Episode 13: End of the Tunnel

    Season 1, Episode 13: End of the Tunnel -Fernando: The name is John Abruzzi. 名字是John Abruzzi A b r u ...

  6. web前端学习策略

  7. kuangbin_ShortPath E (POJ 1860)

    第一次做判环 然后RE了五次 死在了奇怪的点 memset(vis, 0, sizeof dis); memset(dis, 0, sizeof vis); 什么鬼?? 什么鬼?? 其实代码本身还是不 ...

  8. C++ 遇到的问题小结

    1. cannot convert 'std::basic_string<char>' to 'int' in assignment ... 原始code如下: int id2; std: ...

  9. ps色阶

    三原色

  10. div下的img标签中图片的大小设定

    首先html为: <div class="box1"><img src="images/more-1.jpg"></div> ...