Android handler用法及分析

这篇具有很好参考价值的文章主要介绍了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暂时没有办法说出具体使用场景。
removecallbacksandmessages,android,java,开发语言

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)传递对应的参数。

removecallbacksandmessages,android,java,开发语言

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)方法,传递的第二个参数是获取当前系统时间加上传递过来的数值。
removecallbacksandmessages,android,java,开发语言

sendMessageAtTime(@NonNull Message msg, long uptimeMillis)

赋值queue,如果该值为null就报出异常,并返回false。如果queue不为null则执行 enqueueMessage方法。
removecallbacksandmessages,android,java,开发语言

sendMessageAtFrontOfQueue(Message msg)

赋值queue,如果该值为null就报出异常,并返回false。如果queue不为null则执行 enqueueMessage方法,但第三个参数为0。
removecallbacksandmessages,android,java,开发语言

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)方法去执行。
removecallbacksandmessages,android,java,开发语言

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的启动流程有关,只截取了部分内容。

removecallbacksandmessages,android,java,开发语言

方法执行流程先调用Printter接口,然后执行他的println方法,然后判断当前looper是否为null。如果为null则再次执行println进行答应,如果不为null则执行handler中looper的dump方法。
removecallbacksandmessages,android,java,开发语言

toString

会返回关于handler的一串字符串, tohexstring是把数字变成二进制,System.identityHashCode则会根据传递参数返回一个哈希码。
removecallbacksandmessages,android,java,开发语言

getPostMessage(Runnable r)

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

handleCallback(Message message)

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

上面把handler的方法基本都介绍好了,接下来是他的构造方法及分析handler这个都进行了哪些处理。
removecallbacksandmessages,android,java,开发语言

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

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

removecallbacksandmessages,android,java,开发语言

此构造方法和上面同样执行了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,并赋值当前异步状态。(文字描述可能不确切,贴代码了)
removecallbacksandmessages,android,java,开发语言

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

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

到了这里,关于Android handler用法及分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android:Handler

    参考来源 参考来源 参考来源 参考来源 Binder/Socket用于进程间通信,而Handler消息机制用于同进程的线程间通信 handler机制是android系统运行的基础,它采用生产者,消费者模式进行设计。其中生产者和消费者都是handler,多个handler会生产消息message投递到线程共享的messagequeue有序

    2024年02月02日
    浏览(30)
  • Android Handler机制

    Android Handler 机制是一种用于在 Android 应用中处理多线程和异步操作的机制。 为了解决UI线程(主线程)和后台线程之间的通信和异步处理的问题。在Android应用中,特别是在UI开发中,有一些重要的原则需要遵循: 主线程负责UI更新:  Android UI框架是单线程模型的,也就是说

    2024年02月19日
    浏览(34)
  • Android的消息机制--Handler

    Android的消息机制是由Handler、Message、MessageQueue,Looper四个类支撑,撑起了Android的消息通讯机制,Android是一个消息驱动系统,由这几个类来驱动消息与事件的执行 Handler: 用来发送消息和处理消息 无论使用的post ,还是send,都会执行enqueueMessage 方法,将消息加到队列中 发送的

    2024年02月21日
    浏览(51)
  • Android学习之路(13) Handler详解

    Handler是一套 Android 消息传递机制,主要用于线程间通信。 用最简单的话描述: handler其实就是主线程在起了一个子线程,子线程运行并生成Message,Looper获取message并传递给Handler,Handler逐个获取子线程中的Message. Binder/Socket用于进程间通信,而Handler消息机制用于同进程的线程间

    2024年02月09日
    浏览(33)
  • Android Looper Handler 机制浅析

    最近想写个播放器demo,里面要用到 Looper Handler,看了很多资料都没能理解透彻,于是决定自己看看相关的源码,并在此记录心得体会,希望能够帮助到有需要的人。 本文会以 猜想 + log验证 的方式来学习 Android Looper Handler,对于一些复杂的代码会进行跳过,能够理解它们的设

    2024年02月11日
    浏览(34)
  • Android Handler被弃用,那么以后怎么使用Handler,或者类似的功能

    Android API30左右,Android应用在使用传统写法使用Handler类的时候会显示删除线,并提示相关的方法已经被弃用,不建议使用。 Android studio中的显示和建议: 看下官方API关于此处的解释:  简要说就是如果在实例化Handler的时候不提供Looper, 可能导致操作丢失(Handler 没有预估到新

    2023年04月21日
    浏览(36)
  • Android面试题精选——再聊Android-Handler机制-1,已开源

    下面想看Handler的工作流程图:(第一次画图,有点丑,凑合着看吧) 因为Handler的主要作用就是线程切换,所以在图中我把Handler线程变化也画了出来。从这张图我们能看出几点信息: **1、Handler负责消息的发送和处理:**Handler发送消息给MessageQueue和接收Looper返回的消息并且处理

    2024年04月12日
    浏览(38)
  • Android之handler消息处理机制详解

    handler是什么? ​ Handler是一个在消息处理机制中负责发送和处理消息的类,是消息处理的关键。 Handler:负责 发送消息 和处理消息 Looper:内置一个死循环,可以不断的 取出消息 并通知handler处理消息,是handler起作用的基础 Message:消息实体类 MessageQueue:消息队列,负责存储消

    2024年02月04日
    浏览(44)
  • Android中正确使用Handler的姿势

    在Android中,Handler是一种用于在不同线程之间传递消息和任务的机制。以下是在Android中正确使用Handler的一些姿势: 1. 在主线程中创建Handler对象 在Android中,只有主线程(也称为UI线程)可以更新UI。因此,如果您需要在后台线程中执行某些任务并更新UI,则需要使用Handler将任

    2024年02月11日
    浏览(39)
  • Android中线程间的通信-Handler

    Handler机制在Android中主要用于线程间的通信,特别是处理从子线程向主线程(UI线程)传递消息和更新界面。 Message : Message  是在线程间传递的数据载体,它包含了需要处理的数据和一些额外的信息。 每个  Message  对象可以携带一个  what  值(整数类型),用于标识消息的

    2024年02月03日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包