IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> lopper ThreadLocal handler造成内存泄漏的原因 -> 正文阅读

[移动开发]lopper ThreadLocal handler造成内存泄漏的原因

首先looper.prepare()方法会判断是否只有一个looper 如果有多个会报错 ,然后构建出一个looper
在这里插入图片描述
怎么保证一个线程只持有一个looper?
在这里插入图片描述
每个Thread对象持有一个ThreadLocalMap对象(很像hashMap) 再看上面sThreadLocal.set方法
在这里插入图片描述直接获取ThreadLocalMap对象 进行存放 key是线程 value是looper。这也解释了上面通过sThreadLocal.get()方法去进行是否looper已存在的判断。

looper.loop方法内是一个for(;;)的死循环 不过在没有消息处理的时候会进行阻塞 当有消息来时就不断取出MessageQueue中的消息 并将取出来的消息分给对应的Handler处理

ThreadLocal主要作用就是存放looper以及供Thread去取出lopper

handler造成内存泄漏的原因:

内存泄漏的本质:长生命周期对象持有了短生命周期的对象 导致短生命周期的对象不能被回收
首先app最长的生命周期的对象是 : 主线程
主线程有对应的looper以及messageQueue 这些是跟主线程绑定的不会被回收。
当子线程的handler发送一个msg时 msg.target会被赋值成handler存放在messageQueue中
这样handler就与主线程有了关联
在这里插入图片描述

(都是handler内的方法 this就代表handler)
在这里插入图片描述
然后由于handler被相关的(activity)类所持有 所以该类无法被回收

那么避免内存泄漏最简单的措施 就是给handler加static 使其变成静态 这样就与类的对象解绑了 不会影响对象的回收
当然在面对需要activity对象的成员时比如更新ui 此时需要使用弱引用

比如 private WeakReference<***Activity> weakReference;
在handler创造一个构造方法传入对应activity

public MyHandler(HandlerOOMActivity activity) {
            weakReference = new WeakReference<>(activity);
            this.activity = activity;
        }

如果是强引用同样会产生上述情况引起内存泄漏

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-04-06 23:19:35  更:2022-04-06 23:19:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 20:37:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码