首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

花样使用Handler与源码分析

Handler在之前也说到过他的使用以及源码分析,而且相信大家都知道如何使用它,最常见的使用方法恐怕就是下面这种了: Handler handler = new Handler(){ @Override...而对于上面这个Handler对象,如果他是主线程中的,那么我们子线程中需要拿到主线程的这个Handler对象。...final Handler handler = new Handler(){ @Override public void handleMessage(Message msg) {...这种情况下想要拿到主线程的Handler对象也不是不可以,方法还是有很多,把主线程的handler写成static、创建类继承Handler并且序列化,然后通过intent传入…..可能还有其他的一些方法...在使用Handler接受消息时有三种方式: 重写Handler.handlerMessage方法,在该方法中接收 在Handler构造器中实现Callback接口,在回调接口中接收 不做任何处理,但是使用

25850

源码分析|Handler内存泄漏分析及解决

一、介绍 首先,请浏览下面这段handler代码: public class SampleActivity extends Activity { private final Handler...那么,handler是如何造成内存泄漏的呢? 二、分析 1、 Android角度 当Android应用程序启动时,framework会为该应用程序的主线程创建一个Looper对象。...而且,由上文可知,这条消息持有对handler的引用,而handler又持有对其外部类(在这里,即SampleActivity)的潜在引用。...四、泄露解决方案 首先,上面已经明确了内存泄漏来源: 只要有未处理的消息,那么消息会引用handler,非静态的handler又会引用外部类,即Activity,导致Activity无法被回收,造成泄漏...另外,如果想要在handler内部去调用所在的外部类Activity,那么可以在handler内部使用弱引用的方式指向所在Activity,这样统一不会导致内存泄漏。

61910

Android 源码分析 —— Handler、Looper 和 MessageQueue

书接上文,在分析 Toast 源码的过程中我们涉及到了 Handler,这个在 Android 开发里经常用到的类——线程切换、顺序执行、延时执行等等逻辑里往往少不了它的身影,跟它一起搭配使用的通常是...提出问题 根据以上印象,及以前的使用经验,提出以下问题来继续本次源码分析之旅: Thread 与 Looper,Looper 与 MessageQueue,Handler 与 Looper 之间的数量对应关系是怎样的...Handler 与 Looper 在前面略读 Looper 源码的过程中,我发现 Handler 基本没有出场,那么现在,从构造 Handler 的方法开始分析。...它是一个 Handler,它最终会被设置成 sendMessage 的 Handler: public class Handler { // 其它 Handler.sendXXX 方法最终都会调用到这个方法...遗留知识点 ThreadLocal 应用的启动流程 本篇用到的源码分析方法 文档优先 后话 关于 Handler、Looper 和 MessageQueue 的分析在此先告一段落,这部分的内容比较容易分析

33720

Android 源码分析 —— Handler、Looper 和 MessageQueue

分析 Toast 源码的过程中我们涉及到了 Handler,这个在 Android 开发里经常用到的类——线程切换、顺序执行、延时执行等等逻辑里往往少不了它的身影,跟它一起搭配使用的通常是 Runnable...提出问题 根据以上印象,及以前的使用经验,提出以下问题来继续本次源码分析之旅: Thread 与 Looper,Looper 与 MessageQueue,Handler 与 Looper 之间的数量对应关系是怎样的...Handler 与 Looper 在前面略读 Looper 源码的过程中,我发现 Handler 基本没有出场,那么现在,从构造 Handler 的方法开始分析。...它是一个 Handler,它最终会被设置成 sendMessage 的 Handler: public class Handler { // 其它 Handler.sendXXX 方法最终都会调用到这个方法...遗留知识点 ThreadLocal 应用的启动流程 本篇用到的源码分析方法 文档优先 后话 关于 Handler、Looper 和 MessageQueue 的分析在此先告一段落,这部分的内容比较容易分析

59220

【Android 异步操作】Handler 机制 ( Handler 常用用法 | HandlerThread 简介 | HandlerThread 源码注释分析 )

文章目录 一、Handler 常用用法 二、HandlerThread 简介 三、HandlerThread 源码 一、Handler 常用用法 ---- 主线程 Handler 主要作用 : Looper...和 Message 都在 主线程 , Handler 也在 主线程 初始化 , 在子线程中调用该 Handler , 通知主线程进行一些操作 , 一般是更新 UI ; 子线程 Handler 主要作用...: Looper 和 Message 都在 子线程 , Handler 也在 子线程 初始化 , 在主线程中调用该 Handler , 通知子线程进行一些操作 , 一般是网络操作 , 计算 , 或其它耗时任务...; 二、HandlerThread 简介 ---- HandlerThread 就是使用了 Handler 机制的线程 , 其本质是一个 线程 Thread ; 属于上述介绍的 子线程 Handler...* Looper 用于创建 Handler.

45400

小题大做 | Handler内存泄露全面分析

内存泄漏 Java虚拟机中使用可达性分析的算法来决定对象是否可以被回收。即通过GCRoot对象为起始点,向下搜索走过的路径(引用链),如果发现某个对象或者对象组为不可达状态,则将其进行回收。...查看内存泄漏并分析 现在查看内存泄漏还是蛮方便的了,AndroidStudio自带对堆转储(Heap Dump)文件进行分析,并且会把内存泄漏点明确标出来。...GC按钮,一般我们在我们捕获堆转储文件之前,点一下GC,就能把一些弱引用给回收,防止给我们分析带来干扰。...分析堆转储 可以看到左上角有一个Leaks,这就是你内存泄漏的点,点击就能看到内存泄漏的类了。右下角就是内存泄漏类的引用路径。...结合我们所学的Handler知识和这次引用路径分析,这次内存泄漏完整的引用链应该是: 主线程 —> threadlocal —> Looper —> MessageQueue —> Message —>

87030

Android--源码分析Handler巧妙的观察者模式及手写简单实现Handler

对我们来说,Hanlder机制只是安卓SDK封装了一个线程通信的工具罢了,它通过生产者消费者模式处理了多线程同步,当然了它封装的功能很强大 网上关于Handler的源码分析已经有很多了,自己看了源码后,...也想做个总结,今天利用时序图和流程图来做一个简单分析,尽量使用简洁易懂的方式来帮助理解 一、Handler源码分析 1.Looper创建及启动轮询 Java程序的入口为main函数,每个App都是一个单独的...的空构造方法使用,后续分析中可以看到该方法的调用: public static @Nullable Looper myLooper() { return sThreadLocal.get...发送消息与接收消息 我们常常会在Activity中定义一个Handler成员变量(实际上不推荐直接new Handler(),容易内存泄漏),并重写handleMessage方法来接收消息,接下来分析Handler...发送消息与接收消息时序图 在上面的时序图中,增加Handler发送和接收消息,有些调用链就简略掉了: Handler机制 我们目前只争对主线程进行了分析,但不难理解的是,Handler机制除了主线程外

45220

【Android 异步操作】手写 Handler ( Handler 发送与处理消息 | Handler 初始化 | 完整 Handler 代码 )

文章目录 一、Handler 发送与处理消息 ( 两大功能 ) 二、Handler 初始化 三、完整 Handler 代码 一、Handler 发送与处理消息 ( 两大功能 ) ---- Handler...初始化 ---- Handler 初始化 : Handler 的功能一 发送消息 , 就是向 消息队列 MessageQueue 中发送消息 , 并将消息放到 MessageQueue 中的 Message...中获取对应的消息队列 ; 这里就需要特别注意 , 在初始化 Handler 时 , 需要用到 Looper , 如果 Looper 为空 , Handler 初始化就会失败 ; 因此在 创建 Handler...Handler 的操作就是将 Message 放入 MessageQueue 因此在 Handler 中需要持有 MessageQueue 消息队列的引用...代码 ---- package kim.hsl.handler; public class Handler { /** * 消息队列 * 该消息队列封装在 Looper

36000

面试Handler都没答上来,你真的了解Handler吗?Handler全面解析来了!

这次我们说下Android中最常见的Handler,通过解析面试点或者知识点,带你领略Handler内部的神奇之处。...先上一张总结图,看看你是否了解真正的Handler image.png 基本的用法和工作流程 用法很简单,定义一个handler,重写handleMessage方法处理消息,用send系列方法发送消息。...Handler handler = new Handler() { @Override public void handleMessage(@NonNull Message msg) {...「handler相关四大天王」 looper,关联线程并且负责从消息队列拿出消息分发给handler MessageQueue,消息队列,负责消息存储管理 Message,消息对象 handler,负责发送和处理消息...最后我在这里分享一下这段时间从朋友,大佬那里收集到的一些2019-2020BAT 面试真题解析,里面内容很多也很系统,包含了很多内容:Android 基础、Java 基础、Android 源码相关分析

1.2K00
领券