UI同步技术(1)

Handler消息处理类
Handler()或Handler(Looper)
sendMessage(Message)
给消息队列发送消息


obtainMessage()
从消息队列中获取消息


post(Runnable)
消息提交给线程处理


handleMessage
在消息循环中,被调用的消息处理函数

1、Handler:      消息的处理者,handler负责将需要传递的信息封装成Message,通过调用handler对象的obtainMessage()来实现;

将消息传递给Looper,这是通过handler对象的sendMessage()来实现的。继而由Looper将Message放入MessageQueue中。

当Looper对象看到MessageQueue中含有Message,就将其广播出去。该handler对象收到该消息后,调用相应的handler对象的handleMessage()方法对其进行处理。

-------------------------------------------------------------------------------

 Looper类(管理消息队列和消息循环)
static Looper myLooper():获得当前线程的Looper对象
static Looper getMainLooper():获得应用程序主线程的 Looper 对象


prepare
消息队列初始化,产生一个looper(针对无消息循环队列的线程),这个方法为该线程创建了一个 Looper 对象,同时也创建了 MessageQueue 消息队列


loop
进入消息队列循环处理

1、Looper类用来为一个线程开启一个消息循环,是用来封装消息循环和消息队列的一个类    

(1)默认情况下android中新诞生的线程是没有开启消息循环的。(主线程除外,主线程系统会自动为其创建Looper对象,开启消息循环。)     (2)Looper对象通过MessageQueue来存放消息和事件。一个线程只能有一个Looper,对应一个MessageQueue。
(3)Looper是MessageQueue的管理者。每一个MessageQueue都不能脱离Looper而存在,Looper对象的创建是通过prepare函数来实现的。同时每一个Looper对象和一个线程关联。通过调用Looper.myLooper()可以获得当前线程的Looper对象,创建一个Looper对象时,会同时创建一个MessageQueue对象。除了主线程有默认的Looper,其他线程默认是没有MessageQueue对象的,所以,不能接受Message。如需要接受,自己定义一个Looper对象(通过prepare函数),这样该线程就有了自己的Looper对象和MessageQueue数据结构了。Looper从MessageQueue中取出Message后,交由Handler的handleMessage进行处理。处理完成后,调用Message.recycle()将其放入Message Pool中。

其它线程向主线程发送消息,并更新主线程 UI 的内容

 1 //主线程Handler
 2 Handler myHandler = new Handler()
 3 {
 4     @Override
 5     public void handleMessage(Message msg)
 6     {
 7         switch (msg.what)
 8         {
 9         case VALIDATION:
10             
11             system.out.println("收到消息");
12             
13             break;
14 
15         default:
16             break;
17         }
18     }
19 };
20 
21 
22 
23 //子线程
24 loginBtn.setOnClickListener(new OnClickListener()
25 {
26     
27     @Override
28     public void onClick(View v)
29     {                
30         Thread thread = new Thread()
31         {
32             @Override
33             public void run()
34             {
35                 try
36                 {sleep(1000);}
37                 catch (InterruptedException e)
38                 {e.printStackTrace();}
39                 
40                 Message msg = Message.obtain(myHandler);
41                //构建Message对象,从主线程的全局消息池中得到一个 Message 
42                //第一个参数:是自己指定的message代号,方便在Handler选择性地接收 
43                //第二三个参数没有什么意义 
44                //第四个参数需要封装的对象 
45               //Message msg = mHandler.obtainMessage(1, 1, 1, ("我是子线程发的消息内容" + i)); 
46                 msg.what = VALIDATION;
47                 myHandler.sendMessage(msg);
48             }
49         };
50         thread.start();
51 
52         }
53     }
54 });

 

主线程向其它线程发送消息,其它线程又将信息返回给主线程,并更新主线程 UI 的内容

 

  1 public class LooperDemo3 extends Activity
  2 {
  3     private Button btnLooperDemo3_Start;
  4     private TextView tvLooperDemo3_Show;
  5     private Handler mainThreadHandler, otherThreadHandler;
  6     private static int count = 1;
  7 
  8     @Override
  9     protected void onCreate(Bundle savedInstanceState)
 10     {
 11         super.onCreate(savedInstanceState);
 12         setContentView(R.layout.looperdemo3);
 13         //初始化组件
 14         initComponent();
 15         //注册监听
 16         registerListener();
 17     }
 18     
 19     /**
 20      * 
 21      *  函数名称 : initComponent
 22      *  功能描述 : 初始化组件 
 23      *  参数及返回值说明:
 24      *
 25      *  修改记录:
 26      *      日期 :2012-2-10 下午4:14:57    修改人:gy
 27      *      描述    :
 28      *
 29      */
 30     private void initComponent()
 31     {
 32         btnLooperDemo3_Start = (Button)findViewById(R.id.btnLooperDemo3_Start);
 33         tvLooperDemo3_Show = (TextView)findViewById(R.id.tvLooperDemo3_Show);
 34         //实例化一个 OtherThread 线程,并启动线程
 35         new OtherThread().start();
 36     }
 37     
 38     /**
 39      * **********************************************************
 40      *  内容摘要    :其它线程类<p>
 41      *
 42      *  作者    :kyx
 43      *  创建时间    :2012-2-13 下午4:57:43 
 44      *  当前版本号:v1.0
 45      *  历史记录    :
 46      *      日期    : 2012-2-13 下午4:57:43     修改人:
 47      *      描述    :
 48      ***********************************************************
 49      */
 50     class OtherThread extends Thread
 51     {
 52     
 53         @Override
 54         public void run()
 55         {
 56             //创建该线程的Looper对象,用于接收消息 ,同时也创建了一个消息队列
 57             Looper.prepare();
 58             //只要调用了 Looper.prepare() 方法后,这时该线程的Looper对象才会存在,同时会创建一个消息队列。接着才能去实例化  Handler 对象
 59             //这里Looper.myLooper()获得的就是该线程的Looper对象
 60             otherThreadHandler = new OtherThreadHandler(Looper.myLooper());
 61             //Looper.loop():其实就是一个循环,循环从MessageQueue中取消息
 62             Looper.loop();
 63         }
 64     }
 65     
 66     /**
 67      * 
 68      *  函数名称 : registerListener
 69      *  功能描述 : 注册监听 
 70      *  参数及返回值说明:
 71      *
 72      *  修改记录:
 73      *      日期 :2012-2-10 下午4:15:30    修改人:gy
 74      *      描述    :
 75      *
 76      */
 77     private void registerListener()
 78     {
 79         //开始
 80         btnLooperDemo3_Start.setOnClickListener(new OnClickListener()
 81         {
 82             @Override
 83             public void onClick(View v)
 84             {
 85                 //构造消息,从其它线程的全局消息池中得到一个 Message
 86                 Message message = otherThreadHandler.obtainMessage(1, 1, 1, "这些内容是从主线程发来的!!!");
 87                 //通过 otherThreadHandler,将消息发送到其它线程,也就是将消息传递给实例化 otherThreadHandler 的 Looper,
 88                 //就是将消息放入其它线程的消息队列中
 89                 otherThreadHandler.sendMessage(message);
 90             }
 91         });
 92     }
 93     
 94     /**
 95      * **********************************************************
 96      *  内容摘要    :MainThreadHandler类,主线程的 Handler,用于接收从子线程发回来的消息,并将消息内容用于更新主线程的 UI 内容<p>
 97      *
 98      *  作者    :kyx
 99      *  创建时间    :2012-2-13 下午3:40:36 
100      *  当前版本号:v1.0
101      *  历史记录    :
102      *      日期    : 2012-2-13 下午3:40:36     修改人:
103      *      描述    :
104      ***********************************************************
105      */
106     class MainThreadHandler extends Handler
107     {
108         public MainThreadHandler(Looper looper)
109         {
110             super(looper);
111         }
112         
113     
114         @Override
115         public void handleMessage(Message msg)
116         {
117             super.handleMessage(msg);
118             System.out.println("=====MainThreadHandler tvLooperDemo3_Show.setText之前=====");
119             //修改主线程的 UI 内容
120             tvLooperDemo3_Show.setText("我是主线程的 Handler,收到了非主线程的消息:" + (String)msg.obj);
121             System.out.println("=====MainThreadHandler tvLooperDemo3_Show.setText之后=====");
122         }
123     }
124     
125     /**
126      * **********************************************************
127      *  内容摘要    :OtherThreadHandler类,其它线程的 Handler,用于接收从主线程发来的消息,并将消息内容再转发给主线程<p>
128      *
129      *  作者    :kyx
130      *  创建时间    :2012-2-13 下午3:40:36 
131      *  当前版本号:v1.0
132      *  历史记录    :
133      *      日期    : 2012-2-13 下午3:40:36     修改人:
134      *      描述    :
135      ***********************************************************
136      */
137     class OtherThreadHandler extends Handler
138     {
139         public OtherThreadHandler(Looper looper)
140         {
141             super(looper);
142         }
143         
144     
145         @Override
146         public void handleMessage(Message msg)
147         {
148             super.handleMessage(msg);
149             //收到是主线程发送过来的消息
150             System.out.println("what=" + msg.what + "  arg1=" + msg.arg1 + "  arg2=" + msg.arg2 + "  obj=" + (String)msg.obj);
151             System.out.println("=====OtherThreadHandler  handleMessage  sendMessage之前=====");
152             //主线程的 Handler
153             mainThreadHandler = new MainThreadHandler(Looper.getMainLooper());
154             //创建一个新的消息对象
155             Message msgModify = mainThreadHandler.obtainMessage(1, 1, 1, "子线程修改的消息:[" 
156                                                                     + (count++) 
157                                                                     + "]"
158                                                                     + (String)msg.obj); 
159             //通过主线程的 Handler 将消息发送给主线程
160             boolean bl = mainThreadHandler.sendMessage(msgModify);
161             System.out.println("=====OtherThreadHandler  handleMessage  sendMessage之后=====  bl=" + bl);
162         }
163     }
164 }

 

 

 

 

 

 

转载于:https://www.cnblogs.com/totome/archive/2012/09/01/2666878.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值