Android笔记二十五.Android事件Handler消息传递机制

因为Android平台不同意Activity新启动的线程訪问该Activity里的界面控件。这样就会导致新启动的线程无法动态改变界面控件的属性值。但在实际Android应用开发中,尤其是涉及动画的游戏开发中,须要让新启动的线程周期性地改变界面控件的属性值,这就须要借助Handler的消息传递机制实现。

一、Handler类简单介绍

1.功能

Handler类主要有两个作用

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

(2)在主线程中获取消息、处理消息。即当须要界面发生变化的时候。在子线程中调用Handler类的sendEmptyMessage()方法或sendMessage方法来发送消息到Handler。为了让主线程能"适时"地处理新启动的线程所发送的消息,可採用回调的方式来实现--仅仅需重写Handler类中处理消息的方法,当新启动的线程发送消息时。Handler类中处理消息的方法会被自己主动调用。

2.Hnadler类经常用法


方法


描    述


public void handleMessage (Message msg)


通过该方法获取、处理消息


public final boolean sendEmptyMessage (int what)


发送一个仅仅含有what标记的空消息


public final boolean sendMessage (Message msg)


发送消息到Handler,通过handleMessage()方法接收和处理


public final boolean hasMessages (int what)


监測消息队列中是否包括标记为what的消息


public final boolean post (Runnable r)


将一个线程对象加入到消息队列

二、Handler消息传递程序开发步骤

(1)创建一个Handler类对象,并重写handleMessage()方法(用于获取、处理消息);

(2)在新启动的线程中,调用Handler对象的发送消息方法;

(3)利用Handler对象的handleMessage()方法接收消息。然后依据不同的消息运行不同的操作。

注意:发送和处理消息的是同一Handler对象。即自己发送,自己处理。

三、源代码实战

实现:实现一个动态变化的随机数效果。

(1)HandlerTest.java

package com.example.android_handler;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;
public class HandlerTest extends Activity {
 int i=0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        final TextView text = (TextView)findViewById(R.id.random);
        //1.创建一个Handler类对象,并重写handleMessage()方法
        final Handler handler = new Handler(){
   @Override
   public void handleMessage(Message msg)
   {
    if(msg.what==0x520)
    {
     text.setText("获得的新随机数为:\n"+Math.random());
    }
   }
        };

        //2.定义一个计时器。让该计时器以1.2s周期性地运行指定任务(毫秒为基本单位)
//       new Timer().schedule(new TimerTask(){
//	 public void run() {
//	 handler.sendEmptyMessage(0x520);
//	 }
//        }, 0, 1200);
        new Thread(new Runnable(){
   public void run() {
    while(true)
    {
     try {
      Thread.sleep(1200);
     } catch (Exception e) {
      e.printStackTrace();
     }
     handler.sendEmptyMessage(0x520);
    }
   }
        }).start();
    }
}

(2)layout/main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <TextView
        android:id="@+id/random"
        android:textSize="20sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="35dp"
        android:layout_gravity="center"/>
</LinearLayout>

效果演示:

源代码分析:通过以上实例。我们知道在子线程发送消息时能够採用两种方法

a.定时器

new Timer().schedule(new TimerTask()

{

public void run()

{

......功能代码.....

}

}

b.子线程延时

new Thread(new Runnable()

{

public void run()

{

while(true)

{

Thread.sleep(1200);

......功能代码.....

}

}

}).start();

该方法有两点须要注意,一是假设希望程序不停的发送消息,则须要通过while(true)将功能代码包含起来。二是当子线程创建成功后,须要调用Thread的start()方法来启动该子线程。

时间: 2024-10-25 18:28:32

Android笔记二十五.Android事件Handler消息传递机制的相关文章

Android笔记二十六.Android异步任务处理(AsyncTask)

转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空) 一.引言 我们知道Android的UI线程主要负责处理用户的按键事件.用户触屏事件及屏幕绘图事件等,对于其他的操作尽量不要在UI线程中实现,因为这些操作很有可能会阻塞UI线程,比如一些耗时操作,会导致UI界面停止响应,从而降低了用户的体验.所以,为了避免UI线程失去响应的问题,Android建议将耗时操作放在新线程中完成,但新线程也可能需要动态更新UI组件:比如需要从网上获取一个网页,然后在Te

Android笔记二十四.Android基于回调的事件处理机制

如果说事件监听机制是一种委托式的事件处理,那么回调机制则与之相反,对于基于回调的事件处理模型来说,事件源和事件监听器是统一的,或者说事件监听器完全消失了,当用户在GUI控件上激发某个事件时,控件自己特定的方法将会负责处理该事件. 转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空) 一.View类的常见回调方法 为了使用回调机制来处理GUI控件上所发生的事件,需要为该组件提供对应的事件处理方法,而Java又是一种静态语言,我们无法为每个对象动态地添

Android笔记(六十五) android中的动画——属性动画(propertyanimation)

补间动画只能定义起始和结束两个帧在“透明度”.“旋转”.“倾斜”.“位移”4个方面的变化,逐帧动画也只能是播放多个图片,无法满足我们日常复杂的动画需求,所以谷歌在3.0开始,推出了属性动画(property animation) 属性动画已经不再是针对View来设计的了,也不仅限定于只能实现移动.缩放.淡入淡出这几种动画操作,同时也不再是一种视觉上的动画效果了.它实际上是一种不断的对值进行操作的机制,并将值赋值到指定对象的指定属性上,可以是任意对象的任意属性. ValueAnimator Val

Android笔记二十八.Android绘图深度解析

Android绘图深度解析 转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空) Android绘图方法主要有两个步骤: (1)实现一个继承于View组件的类,并重写它的onDraw(Canavas canvas)方法; (2)显示定义的View子类,有两种方法:a.使用一个Activity来显示View子类,即 setContentView(new MyView(this, null));b.在Acitviy的布局文件中增加"包名.View子类&

Android学习笔记二十五之ListView多布局实现

Android学习笔记二十五之ListView多布局实现 这一节是介绍ListView这个控件的最后一节,实现一个Item的多布局.像我们经常在用的各种即时通讯工具,QQ.微信等,假设他们的会话界面是ListView实现的,那么ListView就有多种Item布局,这一节,我们就来实现一个ListView的多种Item. 要实现ListView里面有多种Item,就要重写适配器的两个方法getViewTypeCount()和getItemViewType(int position),第一个方法是

Android之旅十五 android中的网络操作

android中的网络操作和java里面没有什么区别,java里面的很多网络操作方法都可以搬到android中去使用,主要几个点: 1.post和get请求的区别,大家可以在网上查阅有关资料进行了解,get主要以向地址中拼接字符串参数发送到服务器,长度有限制,并且请求参数暴露在地址栏中,不怎么安全:post则主要是将请求参数转换为相应的http协议请求体发送到服务器,相比get方式,参数的长度没有限制,并且参数信息不会暴露给用户: 2.我们在java web里面通过浏览器以post方式发送数据,

马哥学习笔记二十五——ISCSI协议,架构及其安装配置

ISCSI监听在tcp/3260端口 iSCSI Target:iscsi-target-utils 客户端认正方式: 1.基于IP 2.基于用户,CHAP tgtadm:命令行工具,模式化命令 --mode 常用模式:target,logicalunit,account target --op new.delete.show.update.bind.unbind logicalunit --op new.delete account --op new.delete.bind.unbind --

angular学习笔记(二十五)-$http(3)-转换请求和响应格式

本篇主要讲解$http(config)的config中的tranformRequest项和transformResponse项 1. transformRequest: $http({ transformRequest: function(data){ //对前台发送的data进行处理 return data } }) 这个在测试的时候遇到了很大的问题.只要经过transformRequest函数处理,哪怕是不做任何处理,node后台都会报错,需要尝试使用php 2. transformResp

Android笔记(二十五) ListView的缓存机制与BaseAdapter

之前接触了ListView和Adapter,Adapter将数据源和View连接起来,实际应用中,我们要显示的数据往往有很多,而屏幕只有那么大,系统只能屏幕所能显示的内容,当我们滑动屏幕,会将旧的内容放入到缓冲池中,再从缓存池中拿出新的内容显示出来,这就是ListView的缓存机制,这一机制可以极大的节省系统资源. BaseAdapter BaseAdapter通常用于被扩展,扩展BaseAdapter可以对各项列表进行最大限度的定制. 我们可以用自己的类去继承BaseAdapter,然后实现g