我所理解的Handler的使用及其原理浅析

Handler作为Android项目中一个很重要的使用工具,基本项目中都能使用到,主要用于多线程编程。
例如在子线程使用Handler发送消息在主线程中更新UI,还可以用于延时、循环等。并没有深入的讲解。
转载请注明:http://blog.csdn.net/zou_pl/article/details/63253530
  1. Handler使用的小例子
  2. Handler原理解析
  3. Handler使用中技巧

    Handler使用的小例子

    首先看一个Handler使用的小例子:点击一个Button,启动一个线程,然后线程中发送消息到主线程中更新UI。

public class Test extends Activity {
    private static final int MSG_BUTTON_CLICKED = 1;

    public Button mButton = null;

    //新建一个Handler的时候,使用new Handler(Looper.getMainLooper()),确保在主线程中执行
    private Handler mHandler = new Handler(Looper.getMainLooper()) {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case MSG_BUTTON_CLICKED :
                    //接收到消息,在主线程中更新UI,例如隐藏对话框之类的
                    hideDialog();
                    break;
                default:
                    break;
            }
        }
    }; 

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //对Button设置点击事件
        mButton = (Button)findViewById(R.id.live_play_button);
        mButton.setOnKeyListener(mOnKeyListener);
    }

    private View.OnClickListener mClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //点击Button的时候,新开一个线程,这个线程为子线程,不能在子线程中更新UI
            new Thread(new Runnable() {
            @Override
            public void run() {
                //子线程中使用Handler发送一个消息出去,在Handler中接收并且处理这个消息
                Message msg = new Message();
                msg.what = MSG_BUTTON_CLICKED;
                mHandler.sendMessage(msg);
                //或者是下面的方法
                //mHandler.sendEmpty(MSG_BUTTON_CLICKED);
            }
        }).start();
    };


}
上面就是一个简单的例子,Handler如何使用及其大概的流程应该是清楚的。
备注一下,上面的小例子是一个字一个字码出来的,并没有在编译器中严格编程,只是作为一个介绍的小例子,介绍其流程。

## Handler原理解析##
非UI线程不允许操作UI的意思是:在非UI线程中不允许访问来自 android.widget 和 android.view 软件包的组件。
Handler的使用中,需要搞清楚四个组成部分,分别为Handler、Message、MessageQueue、Looper。
Handler是用来发送接收消息,Handler一般使用sendEmptyMessage(int)发送一个int数值的空消息、sendEmptyMessageDelayed(int,delay)延时delay毫秒发送一个int数值、sendMessage(msg)发送一个消息体、sendEmptyMessageDelayed(msg,delay)延时发送一个消息体,Handler在新建Handler时重写的public void handleMessage(Message msg) {..}发送中处理消息;
Message是多线程之间沟通的载体,带有需要交互的信息;
MessageQueue是由很多消息组成的消息队列,先进先出原则;
Looper是消息管家,调用Looper的loop()方法之后,就会进入一个无限循环之中,当发小MessageQueue中有消息时,就会将消息取出交给Handler的handleMessage()进行处理。
每个线程中会有很多很多不同的Message,他们组成了一个MessageQueue,然后Looper对这些Message进行管理,交由Handler处理。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值