您的位置:首页 > 产品设计 > UI/UE

Android开发之使用Handler刷新UI控件

2014-04-29 00:28 435 查看

一、为什么必须使用Handler

线程安全问题

这个问题要理解的话很容易,如果没有这个约束,那么同时有两个线程对一个UI控件进行调整,

那么控件自然就没法正常的工作,而为了解决这种二义性(就是一个东西同时被多个使用者使用,

从而无法判断按哪个使用者来调整)。而Handler永远都是在UI主线程,这就意味着对一个控件的修

改永远只会有一个线程,不会存在多个线程同时修改一个控件。

统一管理

通过Handler可以统一进行对UI的管理,因为Handler采用消息处理的机制。简单理解就是另

一个线程发送一个编号给消息所在的线程,那么该线程的消息处理程序就会收到该消息并进行处理,

而消息采用int类型,所以int能够表示多少种数字就以为着有多少消息可以给你使用(因为存在系统

的消息,所以可能有一部分被系统的消息占有,而不能使用)。

二、Handler介绍

handleMessage(Message msg)

需要重写的方法,该方法为处理消息的核心函数。

sendEmptyMessage(int what)

发送指定的消息,该方法为仅仅只是传递一个int值来表示发送的消息类型。

三、重写handleMessage(Message msg)

1 Handler handler = new Handler(){
2           @Override
3           public void handleMessage(Message msg){
4                    //获得通过handler.sendEmptyMessage发送的消息编码
5                    int what = msg.what;
6                    /* 处理代码 */
7           }
8 }


四、使用handler发送消息

1 handler.sendEmptyMessage(0x101);


五、实例

新建一个线程来给主线程发送消息

1 public class MainActivity extends Activity{
2        private static final int send_msg_code =  0x101;
3
4        Handler handler = new Handler(){
5             @Override
6             public void handleMessage(Message msg){
7                     int what = msg.what;
8                     if(what == send_msg_code){
9                             Toast.makeText(MainActivity.this,"成功",Toast.LENGTH_SHORT).show();
10                     }
11             }
12        }
13
14        @Override
15        protected void onCreate(Bundle savedInstanceState)
16        {
17                 new Thread(new Runnable(){
18                           handler.sendEmptyMessage(send_msg_code);
19                 }).start();
20        }
21 }


六、扩展

post(Runnable r)

将r加入到消息队列中(其实就是利用UI主线程执行一段代码,这样可以随时在其他线程中调整控件)

postDelayed(Runnabled r,long delayMillis)

将r加入到消息队列中,并在指定时间之后触发(单位为毫秒)

removeMessages(int what)

取消消息的发送

sendMessages(Message msg)

通过Message发送消息(这样可以将数据包装进去,一起发送过去)

在满足必要的经济的条件下,研究更佳高深的技术.满足自己的野心
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: