Handler Message总结

2024-08-26 05:18
文章标签 总结 message handler

本文主要是介绍Handler Message总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

当应用程序启动时,会开启一个主线程(也就是UI线程),由她来管理UI,监听用户点击,来响应用户并分发事件等。所以一般在主线程中不要执行比较耗时的操作,如联网下载数据等,否则出现ANR错误。所以就将这些操作放在子线程中,但是由于AndroidUI线程是不安全的,所以只能在主线程中更新UI。Handler就是用来 子线程和创建Handler的线程进行通信的。


         Handler的使用分为两部分:

         一部分是创建Handler实例,重载handleMessage方法,来处理消息。


[java]  view plain copy
  1. mProgressHandler = new Handler()  
  2.         {  
  3.             public void handleMessage(Message msg)  
  4.             {  
  5.                 super.handleMessage(msg);  
  6.             }  
  7.         };  

         当然,也可继承自Handler,同样要实现handleMessage(Message msg)方法。

[java]  view plain copy
  1. class MyHandler extends Handler {  
  2.         public MyHandler() {  
  3.         }  
  4.   
  5.         // 子类必须重写此方法,接受数据  
  6.         @Override  
  7.         public void handleMessage(Message msg) {  
  8.             // TODO Auto-generated method stub  
  9.             Log.d("MyHandler""handleMessage......");  
  10.             super.handleMessage(msg);  
  11.   
  12.         }  
  13.     }  

               另一部分是分发Message 或者Runable对象到Handler所在的线程中,一般Handler在主线程中。


              Handler中分发消息的一些方法
          post(Runnable)
          postAtTime(Runnable,long)
          postDelayed(Runnable long)
          sendEmptyMessage(int what)
          sendMessage(Message)
          sendMessageAtTime(Message,long)
          sendMessageDelayed(Message,long)

             handler本身不仅可以发送消息,还可以用post的方式添加一个实现Runnable接口的匿名对象到消息队列中,在目标收到消息后就可以回调的方式在自己的线程中执行run的方法体。


Message

[java]  view plain copy
  1. Message message = Message.obtain();  
  2.        message.arg1 = 1;  
  3. message.arg2 = 2;  
  4. message.obj = "Demo";  
  5. message.what = 3;  
  6. Bundle bundleData = new Bundle();  
  7. bundleData.putString("Name""Lucy");  
  8. message.setData(bundleData);  


Message 可以传递的参数有:

1. arg1 arg2 整数类型,是setData的低成本替代品。传递简单类型

2. Object 类型 obj

3. what  用户自定义的消息代码,这样接受者可以了解这个消息的信息。每个handler各自包含自己的消息代码,所以不用担心自定义的消息跟其他handlers有冲突。

4.其他的可以通过Bundle进行传递

     Message可以通过new Message构造来创建一个新的Message,但是这种方式很不好,不建议使用。最好使用Message.obtain()来获取Message实例,它创建了消息池来处理的。


      公共构造器

  public      Message()       

  构造器(但是获取Message对象的最好方法是调用Message.obtain())。

 

如下这些通过Message.obtain方式获取Message实例,参数中传递了Handler,发送该消息时不再使用handler.sendMessage这种方式。使用message.sendToTarget();不过归根到底都是调用Handler.sendMessage进行发送消息。Message类中保存Handler实例。


public static Message  obtain (Handler h, int what, int arg1, int arg2, Object obj)

obtain()一样,但是设置了target, what, arg1, arg2obj的值。

         参数

                   h               设置的target

                   what        设置的what

                   arg1         设置的arg1

                   arg2         设置的arg2

                   obj            设置的obj

         返回值

                  从全局池中分配的一个Message对象。

 

public static Message  obtain (Handler h, int what, Object obj)

obtain()一样,但是设置了target, whatobj的值。

         参数

                   h               设置的target

                   what       设置的what

                   obj            设置的obj

         返回值

                  从全局池中分配的一个Message对象。

 

public static Messageobtain (Handler h, int what)

obtain()一样,但是设置了targetwhat的值。

         参数

                   h                target的值

                   what         what的值

         返回值

                  从全局池中分配的一个Message对象。

 

public static Message   obtain (Handler h)

obtain()一样,但是设置了target的值

         参数

                   h               消息对象的target成员的值

         返回值

                  从全局池中分配的一个Message对象。

 

public static Message  obtain (Handler h, Runnable callback)

obtain(Handler)一样,但是设置回调函数,在Message返回时调用。

         参数

                   h               消息对象的target成员的值

                   callback   当消息处理时会调用的回调函数

         返回值

                  从全局池中分配的一个Message对象。

 

public static Message   obtain ()

从全局池中返回一个新的Message实例。在大多数情况下这样可以避免分配新的对象。

 

public static Message   obtain (Handler h, int what, int arg1, int arg2)

obtain()一样,但是设置了target, what, arg1arg2的值

         参数

                   h               设置的targe

                   what        设置的what

                   arg1         设置的arg1

                   arg2         设置的arg2

         返回值

                  从全局池中分配的一个Message对象。

 

public static Message   obtain (Message obj)

obtain(),但是从一个已存在的消息中拷贝值(包括它的目标)。

         参数

                   orig          要拷贝的源消息

         返回值

                  从全局池中分配的一个Message对象。

 

public Bundle   peekData ()

getData()相似,但是并不延迟创建Bundle。如果Bundle对象不存在返回null。更多信息见getData()

         参考

                   getData()

                   setData(Bundle)

 

public void   recyle ()

向全局池中返回一个Message实例。一定不能在调用此函数后再使用Message——它会立即被释放。

 

public void  sendToTarget ()

Handler发送此消息,getTarget()方法可以获取此Handler。如果这个字段没有设置会抛出个空指针异常。

 

public void   setData (Bundle data)

设置一个任意数据值的Bundle对象。如果可以,使用arg1arg2域发送一些整型值以减少消耗。

参考

         getData()

         peekData()

 

public void  setTarget (Handler target)

设置将接收此消息的Handler对象。


             




 PS:

        线程安全和线程不安全

        线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。
        线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据

这篇关于Handler Message总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1107650

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

二分最大匹配总结

HDU 2444  黑白染色 ,二分图判定 const int maxn = 208 ;vector<int> g[maxn] ;int n ;bool vis[maxn] ;int match[maxn] ;;int color[maxn] ;int setcolor(int u , int c){color[u] = c ;for(vector<int>::iter

整数Hash散列总结

方法:    step1  :线性探测  step2 散列   当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度。 HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数  const int MaxN = 3000

状态dp总结

zoj 3631  N 个数中选若干数和(只能选一次)<=M 的最大值 const int Max_N = 38 ;int a[1<<16] , b[1<<16] , x[Max_N] , e[Max_N] ;void GetNum(int g[] , int n , int s[] , int &m){ int i , j , t ;m = 0 ;for(i = 0 ;

go基础知识归纳总结

无缓冲的 channel 和有缓冲的 channel 的区别? 在 Go 语言中,channel 是用来在 goroutines 之间传递数据的主要机制。它们有两种类型:无缓冲的 channel 和有缓冲的 channel。 无缓冲的 channel 行为:无缓冲的 channel 是一种同步的通信方式,发送和接收必须同时发生。如果一个 goroutine 试图通过无缓冲 channel

9.8javaweb项目总结

1.主界面用户信息显示 登录成功后,将用户信息存储在记录在 localStorage中,然后进入界面之前通过js来渲染主界面 存储用户信息 将用户信息渲染在主界面上,并且头像设置跳转,到个人资料界面 这里数据库中还没有设置相关信息 2.模糊查找 检测输入框是否有变更,有的话调用方法,进行查找 发送检测请求,然后接收的时候设置最多显示四个类似的搜索结果

java面试常见问题之Hibernate总结

1  Hibernate的检索方式 Ø  导航对象图检索(根据已经加载的对象,导航到其他对象。) Ø  OID检索(按照对象的OID来检索对象。) Ø  HQL检索(使用面向对象的HQL查询语言。) Ø  QBC检索(使用QBC(Qurey By Criteria)API来检索对象。 QBC/QBE离线/在线) Ø  本地SQL检索(使用本地数据库的SQL查询语句。) 包括Hibern

暑期学习总结

iOS学习 前言无限轮播图换头像网络请求按钮的configuration属性总结 前言 经过暑期培训,完成了五个项目的仿写,在项目中将零散的内容经过实践学习,有了不少收获,因此来总结一下比较重要的内容。 无限轮播图 这是写项目的第一个难点,在很多项目中都有使用,越写越熟练。 原理为制造两个假页,在首和尾分别制作最后一页和第一页的假页,当移动到假页时,使用取消动画的方式跳到