Handler详解系列(1)异步消息机制

     Handler学习知识储备:

     主线程:Main Thread (UI Thread)。andorid执行的线程,称为主线程,负责分发实现到UI窗口,也是应用和UI交互的线程。所以称为UI线程。

     ANR:应用无响应(application not responding)。如果UI线程阻塞超过几秒(一般5秒),会出现应用无响应的额Dialog。

     下面上代码来解释主线程和ANR:

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_handler);
 //查看当前线程,
 Log.d("TAG", "current Thread's name:" +  Thread.currentThread().getName());
 
  //休眠UI线程5秒,制造ANR
        Thread thread = Thread.currentThread();
        try {
            thread.sleep(5*1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
}
      Handler机制,android应用程序在被创建的时候会创建一个UI主线程,为防止阻塞UI主线程,将耗时的操作放到子线程中进行处理,处理完之后操作UI  ,android不允许子线程操作UI,android通过handler消息机制来实现线程之间的通讯。

     Handler机制的主要角色

     Message:消息,包含消息id,消息处理对象以及处理的数据等。由MessageQueue统一列队,由Handler处理。在线程之间传递消息。在内部携带少量的消息,用于在不同线程之间交换数据,除了what字段,用arg1和arg2来携带一些整型数据,使用obj字段携带一个Object对象。

     message包含以下域:

     what:定义消息的类型。 

     obj: 用于保存数据;

     target:处理这个message的Handler对象。

     Message的创建和处理都是一个handler完成,通常是target是自动填充。

     Handler:处理着,负责message的发送及处理。使用handler时,需要实现handlerMessage(Message msg)方法来对特定的Message进行处理。例如更新ui等。

     MessageQueue:消息队列,用来存放Handler发送过来的消息,按照FIFI规定执行。存放Message并非实际意义的保存,将Message以链表的方式串联起来,等待looper的抽取。

    Looper::消息泵,不断地从MessageQueue中抽取Message执行。一个MessageQueue需要一个Looper。

    Thread:线程,负责调度整个消息循环,即消息循环的执行场所。

    Handler机制主要运用

   1.发送消息,在不同的线程间发送消息,使用的方法为sendXXX();

     sendEmptyMessage(int);//发送一个空的消息

     sendMessage(Message);//发送消息,消息中可以携带参数

     sendMessageAtTime(Message,long);//未来某一时间点发送消息

     sendMessageDelayed(Message,long);//延时Nms发送消息


     举例:主线程定义Handler

   

Handler mHandler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case 0:
                    //完成主界面更新,拿到数据
                    String data = (String) msg.obj;
                    textView.setText(data);
                    break;
                default:
                    break;
            }
        }
    };

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值