android_消息模型

消息模型

消息原型,消息队列,发送消息,消息循环,消息获取,消息派发,消息处理,

Android把消息模型抽象成

Message:就是消息原型,包含消息描述和数据,

MessageQueue:就是消息队列,由Looper所持有,但是消息的添加是通过Handler进行;

Looper:完成消息循环,实现Thread的消息循环和消息派发,缺省情况下Thread是没有这个消息循环的既没有Looper;需要主动去创建,然后启动Looper的消息循环loop;与外部的交互通过Handler进行

Handler:就是驾驭整个消息系统模型,统领Message,MessgeQueue和Looper;

    消息循环和消息队列都是属于Thread,而Handler本身并不具有Looper和MessageQueue;

    但是消息系统的建立和交互,是Thread将Looper和MessageQueue交给某个Handler维护建立消息系统模型。所以消息系统模型的核心就是Looper。消息循环和消息队列都是由Looper建立的,而建立Handler的关键就是这个Looper。一个Thread同时可以对应多个Handler,一个Handler同时只能属于一个Thread。Handler属于哪个Thread取决于Handler在那个Thread中建立。在一个Thread中Looper也是唯一的,一个Thread对应一个Looper,建立Handler的Looper来自哪个Thread,Handler属于哪个Thread。故建立Thread消息系统,就是将Thread的Looper交给Handler去打理,实现消息系统模型,完成消息的异步处理

    Handler并不等于Thread,必须通过Thread的Looper及其MessageQueue,用来实现Thread消息系统模型,依附于Thread上

Handler作用

Handler主要接受子线程发送的数据,并用此数据配合主线程更新UI

1.子线程(耗时操作)借用主线程里面的Handler发送一条消息到主线程

2.这个消息会被主线程放到消息队列里面的message queue

3.主线程里面有一个轮询器Looper会发现消息队列里面的消息调用Handler消息处理HandMessage方法

4.handleMessage方法中处理数据(更新UI

handler可以分发Message对象和Runnable对象到主线程中每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程),

两个作用:

       (1):  安排消息或Runnable 在某个主线程中某个地方执行,

       (2)安排一个动作在不同的线程中执行

        Handler中分发消息的一些方法

        post(Runnable)

        postAtTime(Runnable,long)

        postDelayed(Runnable long)

        sendEmptyMessage(int)

        sendMessage(Message)

        sendMessageAtTime(Message,long)

        sendMessageDelayed(Message,long)

        以上post类方法允许你排列一个Runnable对象到主线程队列中,

        sendMessage类方法允许你安排一个带数据的Message对象到队列中,等待更新.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public  class  MyHandler  extends  Activity {  
     static  final  String TAG =  "Handler" ;  
     Handler h =  new  Handler(){  
         public  void  handleMessage (Message msg)  
         {  
             switch (msg.what)  
             {  
             case  HANDLER_TEST:  
                 Log.d(TAG,  "The handler thread id = "  + Thread.currentThread().getId() +  "\n" );  
                 break ;  
             }  
         }  
     };  
   
     static  final  int  HANDLER_TEST =  1 ;  
     /** Called when the activity is first created. */  
     @Override  
     public  void  onCreate(Bundle savedInstanceState) {  
         super .onCreate(savedInstanceState);  
         Log.d(TAG,  "The main thread id = "  + Thread.currentThread().getId() +  "\n" );  
   
         new  myThread().start();  
         setContentView(R.layout.main);  
     }  
   
     class  myThread  extends  Thread  
     {  
         public  void  run()  
         {  
             Message msg =  new  Message();  
             msg.what = HANDLER_TEST;  
             h.sendMessage(msg);  
             Log.d(TAG,  "The worker thread id = "  + Thread.currentThread().getId() +  "\n" );  
         }  
     }  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值