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
[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.example.android_handler;  
  2. import android.app.Activity;  
  3. import android.os.Bundle;  
  4. import android.os.Handler;  
  5. import android.os.Message;  
  6. import android.widget.TextView;  
  7. public class HandlerTest extends Activity {  
  8.  int i=0;  
  9.     @Override  
  10.     protected void onCreate(Bundle savedInstanceState) {  
  11.         super.onCreate(savedInstanceState);  
  12.         setContentView(R.layout.main);  
  13.         final TextView text = (TextView)findViewById(R.id.random);  
  14.         //1.创建一个Handler类对象,并重写handleMessage()方法  
  15.         final Handler handler = new Handler(){  
  16.    @Override  
  17.    public void handleMessage(Message msg)  
  18.    {  
  19.     if(msg.what==0x520)  
  20.     {  
  21.      text.setText("获得的新随机数为:\n"+Math.random());  
  22.     }  
  23.    }  
  24.         };  
  25.        
  26.         //2.定义一个计时器,让该计时器以1.2s周期性地执行指定任务(毫秒为基本单位)  
  27. //       new Timer().schedule(new TimerTask(){  
  28. //   public void run() {  
  29. //   handler.sendEmptyMessage(0x520);  
  30. //   }  
  31. //        }, 0, 1200);  
  32.         new Thread(new Runnable(){  
  33.    public void run() {  
  34.     while(true)  
  35.     {  
  36.      try {  
  37.       Thread.sleep(1200);  
  38.      } catch (Exception e) {  
  39.       e.printStackTrace();  
  40.      }  
  41.      handler.sendEmptyMessage(0x520);  
  42.     }  
  43.    }  
  44.         }).start();  
  45.     }  
  46. }  


(2)layout/main.xml
[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:orientation="vertical"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent" >  
  5.     <TextView  
  6.         android:id="@+id/random"  
  7.         android:textSize="20sp"  
  8.         android:layout_width="wrap_content"  
  9.         android:layout_height="wrap_content"  
  10.         android:layout_marginTop="35dp"  
  11.         android:layout_gravity="center"/>  
  12. </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()方法来启动该子线程。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值