蹒跚走路的程序猿

Android Handler消息传递机制

今天介绍一下Android的消息传递机制Handler,Handler是另一种形式的“事件处理”,这种机制主要是为了解决Android应用的多线程问题---Android平台不允许Activity新启动的线程访问该Activity里的界面组件,这样就会导致新启动的线程无法动态改变界面组件的属性值。

  Handler类主要有两个作用:

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

    在主线程中获取、处理消息。

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

    void handlerMessage(Message msg):处理消息的方法,该方法通常用于被重写。

    final boolean hasMessage(int what):检查消息队列中是否包含what属性为指定值的消息。

    final boolean hasMessage(int what,Object object):检查消息队列中是否包含what属性为指定值且object属性为指定对象的消息。

    多个重载的Message obtainMessage():获取消息。

    sendEmptyMessage(int what):发送空消息。

    final boolean sendEmptyMessageDelayed(int what,long delayMillis):指定多少毫秒之后发送空消息。

    final boolean sendMessage(Message msg):立即发送消息。

    final boolean sendMessageDelayed(Message msg,long delayMillis):指定多少毫秒之后发送消息。

  下面看个实例,该实例通过一个新线程来周期性地修改ImageView所显示的图片,直接上代码:

 1 public class HandlerTest extends Activity
 2 {
 3     //定义周期性显示的图片的ID
 4     int[] imageIds = new int[]
 5     { 
 6         R.drawable.java,
 7         R.drawable.ee,
 8         R.drawable.ajax,
 9         R.drawable.xml,
10         R.drawable.classic        
11     };
12     int currentImageId = 0;
13     @Override
14     public void onCreate(Bundle savedInstanceState)
15     {
16         super.onCreate(savedInstanceState);
17         setContentView(R.layout.main);
18         final ImageView show = (ImageView)findViewById(R.id.show);        
19         final Handler myHandler = new Handler()
20         {
21             @Override
22             public void handleMessage(Message msg)
23             {
24                 //如果该消息是本程序所发送的
25                 if (msg.what == 0x1233)
26                 {
27                     //动态地修改所显示的图片
28                     show.setImageResource(imageIds[currentImageId++]);
29                     if (currentImageId >= 4)
30                     {
31                         currentImageId = 0; 
32                     }
33                 }
34             }
35         };
36         //定义一个计时器,让该计时器周期性地执行指定任务
37         new Timer().schedule(new TimerTask()
38         {
39             @Override
40             public void run()
41             {
42                 //新启动的线程无法访问该Activity里的组件
43                 //所以需要通过Handler发送信息
44                 Message msg = new Message();
45                 msg.what = 0x1233;
46                 //发送消息
47                 myHandler.sendMessage(msg);
48             }
49         }, 0 , 800);
50     }
51 }

 

posted on 2013-09-01 23:24  蹒跚走路的程序猿  阅读(258)  评论(0编辑  收藏  举报

导航