Android handler用法及分析

这里将handler机制中的message,looper和messagequeue分开分析,分开了解之后,会在进行一个总结。先来看handler里面都有哪些方法都做了哪些事情,hide方法和带有@UnsupportedAppUsage注释的方法(此方法不对外暴露使用)暂不描述

Callback

handler要传递的callback接口在handler类里面,该接口里面只有一个要实现的handleMessage方法。

handleMessage

该方法没有具体的实现内容,此方法需要子类实现才可接收消息。

dispatchMessage

handler的消息处理在这个方法里面,该方法会优先判断message里面的callback是否为空。如果message的callback不为空,则执行handler的handleCallback方法。如果message的callback为空,则判断handler被实例化的时候是否有被传递callback参数,如果不为空并且callback处理了此消息则return。 如果handler里面的callback为空则执行自身的handleMessage方法。

createAsync(Looper)

此方法会创建并返回一个异步处理的handler,如果loop不为null的话。

createAsync(Looper,Callback)

如果两个参数都不为null的话,会返回一个实例化带有传递过来这两个参数的异步handler。
异步的使用场景看一下对方法的描述吧,个人感觉这个方法比较冷门,项目里面没有用到过异步的handelr暂时没有办法说出具体使用场景。
在这里插入图片描述

getMessageName

此方法会先判message的callback是否为null,如果不为null则返回callback.getclass.getname。如果为null则返回"0x" + Integer.toHexString(message.what)

obtainMessage

此方法会返回一个新的message。执行message里面的obtain方法,具体执行了哪些操作会在message里面进行描述。

obtainMessage(int what)

此方法会返回一个新的message。执行message里面的obtain(handler,int)方法,具体执行了哪些操作会在message里面进行描述。

obtainMessage(int,Object)

此方法会返回一个新的message。执行message里面的obtain(handler,int, obj)方法,具体执行了哪些操作会在message里面进行描述。

obtainMessage(int what, int arg1, int arg2, Object obj)

此方法会返回一个新的message。执行message里面的obtain(handler,int, arg1,arg2,obj)方法,具体执行了哪些操作会在message里面进行描述。

post

此方法会执行sendMessageDelayed(message,long),传递的第一个参数message是通过getPostMessage来获取的,第二个参数则为0. 最终执行内容查看sendMessageDelayed(message,long)方法

postAtTime(Runnable r, long uptimeMillis)

此方法会执行sendMessageAtTime(message,long)方法,传递runable参数通过getPostMessage方法获取message,具体执行了哪些操作请看sendMessageAtTime方法。

postAtTime( Runnable r, Object token, long uptimeMillis)

此方法会执行sendMessageAtTime(message,long)方法,传递runable和object参数通过getPostMessage方法获取message,具体执行了哪些操作请看sendMessageAtTime方法。

postDelayed(Runnable r, long delayMillis)

此方法会调用sendMessageDelayed(Message msg, long delayMillis)方法,第一个参数通过传递runnable走getPostMessage方法获取message,sendMessageDelayed方法的具体操作请看相应方法描述。

postDelayed(Runnable r, int what, long delayMillis)

此方法会调用sendMessageDelayed(Message msg, long delayMillis)方法,第一个参数通过传递runnable走getPostMessage方法获取message,并赋值这个message的what,sendMessageDelayed方法的具体操作请看相应方法描述。

postDelayed(Runnable r, Object token, long delayMillis)

此方法会调用sendMessageDelayed(Message msg, long delayMillis)方法,第一个参数通过传递r和token走getPostMessage方法获取message.sendMessageDelayed方法的具体操作请看相应方法描述.

postAtFrontOfQueue

此方法调用sendMessageAtFrontOfQueue方法,传递的参数为通过传递runnable的getPostMessage方法获取到的message.sendMessageAtFrontOfQueue方法的具体操作请看相应方法描述。

removeCallbacks(Runnable r)

此方法会执行messagequeue里面的 removeMessages(Handler h, int what, Object object)方法,第三个参数为null,具体内容请看MessageQueue的描述或者整体总结。

removeCallbacks(Runnable r, @Nullable Object token)

此方法会执行messagequeue里面的 removeMessages(Handler h, int what, Object object)方法,具体内容请看MessageQueue的描述或者整体总结。

sendMessage

此方法会调用sendMessageDelayed(Message msg, long delayMillis)方法,第二个参数为0.

sendEmptyMessage

此方法会调用sendEmptyMessageDelayed(Message msg, long delayMillis)方法,第二个参数为0.

sendEmptyMessageDelayed(int what, long delayMillis)

此方法会通过Message.obtaion方法获取一个message,然后吧传递过来的int值赋值给what,并调用sendMessageDelayed(Message msg, long delayMillis)传递对应的参数。

在这里插入图片描述

sendEmptyMessageAtTime(int what, long uptimeMillis)

此方法会通过Message.obtaion方法获取一个message,然后吧传递过来的int值赋值给what,并调用sendMessageAtTime(Message msg, long uptimeMillis)方法传递对应的参数。

sendMessageDelayed(Message msg, long delayMillis)

此方法先判断 long值是否小于0,如果小于零就赋值为0. 然后调用sendMessageAtTime(@NonNull Message msg, long uptimeMillis)方法,传递的第二个参数是获取当前系统时间加上传递过来的数值。
在这里插入图片描述

sendMessageAtTime(@NonNull Message msg, long uptimeMillis)

赋值queue,如果该值为null就报出异常,并返回false。如果queue不为null则执行 enqueueMessage方法。
在这里插入图片描述

sendMessageAtFrontOfQueue(Message msg)

赋值queue,如果该值为null就报出异常,并返回false。如果queue不为null则执行 enqueueMessage方法,但第三个参数为0。
在这里插入图片描述

enqueueMessage( MessageQueue queue, Message msg, long uptimeMillis)(此处可在最后讲一下)

赋值message的额arget为this,message的workSourceUid会通过ThreadLocalWorkSource获取一个当前线程上执行的代码uid,这个uid在常见的框架中使用,如binder和handler这种进程间通信使用,如果要在具体僚机的话需要在ThreadLocalWorkSource类 里面去看了,然后会判断当前的handler是否为异步。如果为异步则执行 msg.setAsynchronous(true),然后交给queue的enqueueMessage(message,long)方法去执行。
在这里插入图片描述

removeMessages(int what)

会执行queue的removeMessages(Handler h, int what, Object object) 方法,第三个参数为null,删除掉指定的message.

removeMessages(int what, Object object)

会执行queue的removeMessages(Handler h, int what, Object object) 方法,删除掉指定的message。

removeCallbacksAndMessages(Object token)

会调用queue的removeCallbacksAndMessages(Handler h, Object object) 方法,删除掉所有的消息和回调内容。

hasMessages(int what)

查询是否有某个message,这里会执行queue的hasMessages(Handler h, Runnable r, Object object)方法,第三个参数为null。

hasMessages(int what, Object object)

查询是否有某个message,这里会执行queue的hasMessages(Handler h, Runnable r, Object object)方法。

hasCallbacks(Runnable r)

这里会执行queue的hasMessages(Handler h, Runnable r, Object object)方法,第三个参数为null。

getLooper()

返回handler的loop值,handler的loop值会在被实例化的时候进行赋值,可看后续方法介绍进行了解。

dump(Printer pw, String prefix)

此方法会打印出handler里面的message的内容,下图中的顺序和activity的启动流程有关,只截取了部分内容。

在这里插入图片描述

方法执行流程先调用Printter接口,然后执行他的println方法,然后判断当前looper是否为null。如果为null则再次执行println进行答应,如果不为null则执行handler中looper的dump方法。
在这里插入图片描述

toString

会返回关于handler的一串字符串, tohexstring是把数字变成二进制,System.identityHashCode则会根据传递参数返回一个哈希码。
在这里插入图片描述

getPostMessage(Runnable r)

此方法为private,此方法会先通过message的obtain方法获取一个message。然后再把传递过来的runnable赋值给message.callback,并返回此message。

handleCallback(Message message)

执行传递过来的message.callback的run方法

上面把handler的方法基本都介绍好了,接下来是他的构造方法及分析handler这个都进行了哪些处理。
在这里插入图片描述

通过Handler()去实例化handler的时候如果当前获取不到looper就会抛出异常,这个实例化方法里只执行了this(null, false),这里调用的是handler的 Handler(Callback callback, boolean async)构造方法,这个方法具体坐那哪些内容,咱们接着往下看其他的构造方法。

在这里插入图片描述
这种方式同样也是调用了 Handler(@Nullable Callback callback, boolean async),但是会把传过来的callback参数传递下去。
在这里插入图片描述
此构造方法将looper参数传递进来,执行Handler(@NonNull Looper looper, @Nullable Callback callback, boolean async)构造方法,此构造方法内容具体执行了哪些,请在期待一下。

在这里插入图片描述

此构造方法和上面同样执行了Handler(@NonNull Looper looper, @Nullable Callback callback, boolean async)构造方法,不过多了一个callback。

----------------------------------------------我是一个分割线--------------------------------------------------------------

解释一下,这里为什么单独分割。因为, handler 被实例化之后最终其实都是用这两个构造方法(Handler(Callback callback, boolean async) 和Handler(Looper looper, Callback callback, boolean async))执行实例化的,这两个构造方法是hide方法,外部不能引用的 。 也算是方便查看。(其实是不知道怎么在编写的时候让他换行展示┭┮﹏┭┮)

先看Handler(@Nullable Callback callback, boolean async)方法,这里会先判断一个变量FIND_POTENTIAL_LEAKS。这个变量是在检查匿名、本地或成员类的时候进行改变的,默认情况下为false。 判断这个变量之后会通过looper.mylooper获取当前handler所在的looper值,如果获取不到则判处异常。获取到了则把looper的queue赋值给当前handler的queue,callback赋值到当前对象的handler,并赋值当前异步状态。(文字描述可能不确切,贴代码了)
在这里插入图片描述

接下来是Handler(Looper looper, Callback callback, boolean async)构造方法,因为这个构造方法传递过来的参数比较齐全,基本都是handler所需参数,所以这里就直接通过对应内容进行了赋值。上代码了。
在这里插入图片描述

handler类里面整体做的事情基本都是都是先获取到looper,根据looper是否存在再决定后续的执行,当looper存在之后会得到一个queue,这个时候通过handler传递过来的message就可以都放到queue里面去处理,有的时候传递过来的可能不是messagee本身,但都会通过Message.obtain()方法返回来新的message来进行赋值,然后把赋值处理好的message交给queue去具体执行操作。他会先找到一个总管理(looper)然后把传递过来的东西包装好成为一个包裹(message),包装好之后会送给总管理下的团队(MessageQueue)去进行相应的操作。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值