【第22期】观点:IT 行业加班,到底有没有价值?

Android之Handler消息机制

转载 2016年08月31日 08:29:14

Android中handler类的主要作用

1、与其他线程协同作用

2、接收其他线程的消息并通过接收到的消息更新主UI线程的内容

 解决的问题:

负责主线程与子线程之间进行通讯,从而让子线程与主线程之间建立起协作的桥梁,使Android的UI更新的问题得到完美解决

Handler与子线程协作实例

1、创建Handler实现类,在主UI所在类中的内部类

class MyHandler extends Handler {    

      public MyHandler() { }    

      public MyHandler(Looper L) {    

               super(L);    

      }    

      // 重写handleMessage方法,接受数据并更新UI   

      @Override    

       public void handleMessage(Message msg) {    

                   super.handleMessage(msg);    

                   //此处根据msg内容进行UI操作   

           }    

 }  

2、子线程的实现

class MyThread implements Runnable {    

   public void run() {    

        Message msg = new Message();    

        Bundle b = new Bundle();   

         b.putString("cmd", "update");    

         msg.setData(b);    

        MainActivity.this.myHandler.sendMessage(msg);

        //通知Handler更新UI   

     }    

 }  

通过以上的两个实现,我们只需要在MainActivity中声明MyHandler实例对象就可以完成线程之间的通讯和界面的更新操作。

MyHandler myHandler = newMyHandler();

Android提供了Handler和Looper来满足线程间的通信。Handler先进先出原则。Looper类用来管理特定线程内对象之间的消息交换。

1)Looper:一个线程可以产生一个Looper对象,由它来管理此线程里的MessageQueue(消息队列)

1、Handler创建消息

     每一个消息都需要被指定的Handler处理,通过Handler创建消息便可以完成此功能。Android消息机制引入了消息池机制。Handler创建消息时首先看一下消息池是否有消息,如果有,就直接从消息池拿出消息,如果没有,就重新初始化一个消息实例。使用消息池的好处就是:消息不被使用的时候,并不作为垃圾回收,而是放入消息池,可供下次handler创建消息时使用,消息池提高了消息对象的复用,减少系统垃圾回收的次数。



2.handler发送消息

  UI主线程初始化第一个Handler时会通过ThreadLocal创建一个Looper,该Looper与UI主线程一一对应。使用ThreadLocal的目的是保证每一个线程创建唯一一个Looper。之后其他Handler初始化的时候直接获取第一个handler创建的Looper。Looper初始化的时候会创建一个消息队列MessageQueue。至此,主线程、消息循环、消息队列之间的关系是1:1:1。



3、Handler处理消息

     UI主线程通过Looper循环查询消息队列UI_MQ,当发现有消息存在时会将消息队列中取出。首先分析消息,通过消息的参数判断该消息对应的Handler,然后将消息分发到指定的Handler进行处理。

子线程通过Handler、Looper与UI主线程通信的流程如图所示。







举报

相关文章推荐

【Android】源码分析 - Handler消息机制再梳理

前言多线程的消息传递处理,从初学Android时的Handler,懵懵懂懂地照猫画虎,到后来一头雾水的疑惑它为什么这么复杂,再到熟悉之后的叹为观止,一步步地都是自己踩过的足迹,都是成长啊哈哈哈。虽然离...

Android技术点记录-handler消息传递机制

一、相关的一些基本概念  1. Android进程(该段内容来自网络参考)        当一个程序第一次启动的时候,Android会启动一个LINUX进程和一个主线程。默 认的情况下,所有该程序的组件都将在该进程和线程中运行。同时,Android会为每个应用程序分配一个单独的LINUX用户。Android会尽量保留一个正在运行进程,只在内存资源出现不足时,Android 会尝试停止一些进程从而释放足够的资源给其他新

又一年对Android消息机制(Handler&Looper)的思考

前言Android消息机制对于每一个Android开发者来说都不陌生,在日常的开发中我们不可避免的要经常涉及这部分的内容。从开发角度来说,Handler是Android消息机制的上层接口,这使得在开发...

Android Handler 异步消息处理机制的妙用 创建强大的图片加载类

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38476887,本文出自【张鸿洋的博客】 最近创建了一个群,方便大家交流,群号:<span style="

Android的消息机制Handler详解

Android的消息机制详解 Android的消息机制主要指 Handler 的运行机制
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)