Handler相关的弱引用

【第八关】Android Handler详解 【第八关】Android Handler详解Handler是什么Handler作用为什么要使用Handler?相关概念工作原理使用步骤在Handler中发生的内存泄漏问题描述原因总结解决方案 Handler是什么 Handler是一个消息分发对象。handler是Android给我们提供用来更新UI的一套机制,也是一套消息处理机制,我们可以发消息,也可以通过它处理消息。简单定义为一套Android消息传递机制 1:To schedule messages and runnables to be execu 阅读详情
如果一个对象只具有弱引用,那就类似于可有可物的生活用品。弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它 所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程, 因此不一定会很快发现那些只具有弱引用的对象。  弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回 收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。(正常编程都是强引用~)


更新到adt2.0的开发者们可能会在handler上发现这么一条警告:This Handler class should be static or leaks might occur 。
首先在ADT 20 Changes我们可以找到这样一个变化:New Lint Checks:Look for handler leaks: This check makes sure that a handler inner class does not hold an implicit reference to its outer class.

翻译过来就是,Lint会增加一个检查项目即:确保class内部的handler不含有外部类的隐式引用 。
同一个线程下的handler共享一个looper对象,消息中保留了对handler的引用,只要有消息在队列中,那么handler便无法被回收,如果handler不是static那么使用Handle的Service和Activity就也无法被回收。这就可能导致内存泄露。当然这通常不会发生,除非你发送了一个延时很长的消息。

知道了原因我们在来看解决方法:
1.最不想动代码的同学,可以在Preference搜一下Lint,在Lint Error Checking里搜HandlerLeak,然后选择ignore,然后整个世界清净了。。。。(不推荐)
2.上面的方法虽然简单,但是肯定不好的。。。给这个检查肯定是有用的,那第二种方法,自然就是把Handler定义成static,然后用post方法把Runnable对象传送到主线程。

例:

                private static Handler handler;

                public void onCreate(Bundle savedInstanceState) {
                      super.onCreate(savedInstanceState);
                      setContentView(R.layout.main); // Create a handler to update the UI
                      handler = new Handler();
                }

                void test() {
                      handler.post(new MyRunnable());// 这样的方法同样可以用 SmsPopupActivity.this.runOnUiThread(new MyRunnalble());来替换,效果是一样的。
                }

                static public class MyRunnable implements Runnable {
                      @Override
                      public void run() {
                                imageView.setImageBitmap(downloadBitmap);
                                dialog.dismiss();
                        }
                } 
3.看到这种方式可能又有很多人不乐意了,原来我一个handler处理多个消息,多舒服,你现在要我把每个消息都换成对应的Runnable对象发送,多不爽。那我们可以通过弱引用的方式来做,例子如下示:我们首先定义了一个static的inner Class MyHandler然后让它持有Activity的弱引用。这样lint warning就消失了。
        static class MyHandler extends Handler {
                WeakReference<PopupActivity> mActivity;

                MyHandler(PopupActivity activity) {
                        mActivity = new WeakReference<PopupActivity>(activity);
                }

                @Override
                public void handleMessage(Message msg) {
                        PopupActivity theActivity = mActivity.get();
                        switch (msg.what) {
                        case 0:
                                theActivity.popPlay.setChecked(true);
                                break;
                        }
                }
        };

        MyHandler ttsHandler = new MyHandler(this);
Android——Handler详解 1. 简介 Handler是一套 Android 消息传递机制 可以说只要有异步线程与主线程通信的地方就一定会有 Handler。 在多线程的应用场景中,将工作线程中需更新UI的操作信息 传递到 UI主线程,从而实现 工作线程对UI的更新处理,最终实现异步消息的处理 使用Handler消息传递机制主要是为了多个线程并发更新UI的同时,保证线程安全 2. 相关概念解释 Handler、Message、Message Queue、Looper Android消息机制: 以Handler的sendMes 阅读详情

相关推荐

Oracle数据库的内存管理优化技巧

Oracle数据库作为企业级数据库管理系统,广泛应用于各种业务场景。内存管理是Oracle数据库性能优化的关键环节,合理的内存管理可以显著提高数据库的响应速度和吞吐量。本文的目的是深入探讨Oracle数据库内存管理的优化技巧,涵盖了系统全局区(SGA)和程序全局区(PGA)的管理、内存分配算法、内存参数调整等方面。通过详细的讲解和实际案例分析,帮助读者掌握优化Oracle数据库内存使用的方法,提高数据库的性能和稳定性。

2502_91592937的博客 997

Android 优化之handler弱引用

Android 开发的小伙伴都知道, 典型的开发场景就是用 Handler 来更新UI或者做一些简单耗时的操作。 举个例子,这样一写就完成了。 Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what

weixin_44021334的博客 3470

手把手教你读懂蓝牙BQB射频测试报告:以PRBS9为例的实战分析

本文以蓝牙BQB射频测试中的PRBS9信号为例,提供了一份实战分析指南。文章深入解读了输出功率、调制特性、邻道泄漏等核心测试项,并分享了信号分析仪操作技巧、测试环境搭建要点及设备选型建议,旨在帮助工程师精准解读报告,高效定位问题,确保产品顺利通过认证。

weixin_29289821的博客 261

android中关于弱引用,This Handler class should be static or leaks might occur

转载地址:http://hi.baidu.com/cenxcen/item/91ef79985d5c2532336eebc1 更新到adt2.0的开发者们可能会在handler上发现这么一条警告:This Handler class should be static or leaks might occur 。 首先在ADT 20 Changes我们可以找到这样一个变化:New Lint Ch

yujina2008的专栏 797

ArcGIS中地理坐标系与投影坐标系以及投影转换

简单介绍arcgis软件中坐标系定义、设置和常见问题。

weixin_41399650的博客 8万+

加权均值向量算法(INFO)详解:从数学原理到智能算法

本文系统介绍了加权均值向量算法(INFO)的理论基础、数学模型与实现应用。该算法基于加权均值数学概念,通过MeanRule规则平衡探索与开发能力,具有结构新颖、参数合理的特点。核心内容包括:1) 算法理论基础,阐述加权均值数学定义与小波函数权重计算;2) 算法原理,详细解析更新规则、向量组合和局部搜索三阶段数学模型;3) 实现方法,提供MATLAB代码关键参数解析;4) 改进方向,介绍INFO-KELM混合模型等变体;5) 应用案例,涵盖函数优化、工程设计与机器学习领域。

qq_42212808的博客 235

弱引用Handler

handler 导致内存泄漏问题很常见,因此需要让它弱引用 context。如下处理一下更好用 消息处理回调接口 public interface IMessageConsumer { //消费事件 void handleMessage(Message msg); } 弱引用包装 public class WeakHandler extends Handler { private final WeakReference<IMessageConsumer> co

战歌起 436

vue-vben-admin 打包编译报错Failed to resolve entry for package “@vben-core/design“ 的解决方法

如果你在你是不是在 apps/子目录下执行了 build?# 项目根目录 pnpm build而不是在下面单独打包。这个问题本身不复杂,但非常容易被误导去“怀疑依赖、怀疑配置、怀疑人生”。实际上,只要理解vue-vben-admin 是 monorepo 架构,很多类似问题都会迎刃而解。如果你后面还遇到 vben-admin 的构建、部署、权限或性能相关问题,这一套思路都很有用。希望这篇记录,能帮你节省至少半小时的排坑时间。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 423

Handler的弱引用

mInterHandler是一个私有静态内部类继承自Handler,内部持有MainActivity的弱引用,这样做的目的是避免内存泄露WeakReference<MainActivity>中的MainActivty是你所在的类。 private InterHandler mInterHandler = new InterHandler(this); private stati...

xxdw1992的博客 1867

从 CDS 到对外接口:彻底吃透 SAP Business Service Definition 与 Service Binding

SAP ABAP开发中的Business Service(业务服务)已成为连接数据模型与外部消费的关键枢纽。Service Definition定义了要暴露的CDS实体,而Service Binding则负责将定义绑定到具体协议(如OData V2/V4)并发布为可消费服务。这种分层设计实现了同一服务定义在不同协议间的复用,符合SAP的解耦技术路线和Clean Core原则。从CDS视图到最终服务的完整链路清晰:先定义CDS模型,再通过Service Definition暴露实体,最后用Service Bi

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 160

YOLO26改进策略【YOLO和Mamba】| MLLA:Mamba-Like Linear Attention,融合Mamba设计优势的注意力机制

本文记录的是利用模块优化的目标检测网络模型。模块具有独特优势。它不同于传统模块,能同时兼顾局部特征高效建模与长距离交互学习。常见模块要么在局部特征处理上有优势但长距离交互能力弱,要么反之,而模块克服了此问题。它融合了Mamba模型和线性注意力机制的优势,通过独特的结构设计,能够在保持计算效率的同时,精准地建模局部特征并学习长距离交互信息。本文将其用于的模型改进和二次创新,能够更加关注图像中的重要特征区域,抑制背景等无关信息的干扰,从而突出目标物体的关键特征。Demystify Mamba in Vision

Limiiiing的博客 214

Android世界:Handler机制及其弱引用实现

一、Handler是什么 Android的一种机制,是实现主线程与子线程、子线程与子线程之间消息传递的通讯机制。 包含有: Handler--负责消息的发送与处理; Looper-- 死循环的消息队列,实为消息传输的通道; MessageQueue--消息列表,消息存放的缓冲区,当有多条消息无法及时处理,按照队列进行排队处理; Message--消息,内含简单内容; 大体流程...

GoneIsForever的博客 1017

2021.02.23丨Virsorter2安装使用及答疑

最近项目比较多,又在学英语,写文章的时间少了很多。最近接到一个病毒组装的项目。用之前组装工具(ABYSS、SPAdes)都没有能够组装较为完整的scafford,今天介绍一款专门用于组装病毒的工具——Virsorter。 Virsorter最早版本发布于2015年,目前已经有了第二个版本。主要用于病毒的组装的注释。详细情况可以查看文章:https://peerj.com/articles/985/ 安装流程 安装文档: https://github.com/jiarong/VirSorter2/b

4836

一篇明白Andorid中的Handler

handler是一套 Android 消息传递机制,这里的消息指的是message类,可以理解成handler是对message进行传递的一种机制。

weixin_43917227的博客 1795

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Android Handler内存泄漏和解决方法

一、Handler内存泄漏原因 handler发送的消息在当前handler的消息队列中,如果此时activity finish掉了,那么消息队列的消息依旧会由handler进行处理,若此时handler声明为内部类(非静态内部类),我们知道内部类天然持有外部类的实例引用,那么就会导致activity无法回收,进而导致activity泄露。 二、Handler内存泄漏几种情况1、隐式引用 ...

chenhande1990chenhan的专栏 529

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

一文彻底扒光 Handler

典型的生产者-消费者模式。Android跨进程要掌握的是Binder, 而同一进程中最重要的应该就是Handler 消息通信机制了。我这么说,大家不知道是否认同,如果认同,还希望能给一个关注哈。

maniuT的博客 276

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

不知庐山真面目只缘身在此山中,讲解一下Handler

现在随着短视频,抖音,快手的流行NDK模块开发也显得越发重要,需要这块人才的企业也越来越多,随之学习这块的人也变多了,音视频的开发,往往是比较难的,而这个比较难的技术就是NDK里面的技术。音视频/高清大图片/人工智能/直播/抖音等等这年与用户最紧密,与我们生活最相关的技术一直都在寻找最终的技术落地平台,以前是windows系统,而现在则是移动系统了,移动系统中又是以Android占比绝大部分为前提,所以AndroidNDK技术已经是我们必备技能了。

2401_84121573的博客 686

Handler的正确写法

static class TestHandler extends Handler { private final WeakReference<Test> mActivityRef; TestHandler(Test activity) { mActivityRef = new WeakReference<>(activity); }

zhouxin1233的博客 807

Android:Handler

一个线程只有一个Looper,但可对应多个Handler,当通过Looper.prepare方法创建Looper时会调用ThreadLocal的get()方法来检查ThreadLocalMap中是否已经set过Looper。ActivityThread中的main()已经对Looper进行了prepar()操作,已经可以通过getMainLooper获取。

weixin_51109304的博客 2702

我认识Handler又多了一点点...

ANR异常:Application Not Response 应用程序无响应。出现这个异常时,会为用户弹出交互式弹窗,影响用户使用和体验。内存泄露:没有用的对象资源仍与GC-Root保持可达路径,导致系统无法回收。这样串联下来,对Handler是否有了一个更全面的认识呢?相信让Handler更充盈了一些。当然他不止这些。还需要我们更深入更广度的挖掘。探究内部原理,发现其中奥秘。如有不妥之处,望见谅。提供您的宝贵建议、意见,我会积极改正的。后续有新文章的发布,欢迎持续关注。也欢迎关注关注我的掘金博客。

摩羯座程序媛的专栏 734

Android基础知识巩固系列 Android多线程编程(Handler机制或异步消息处理机制)

参考网站:https://www.jianshu.com/p/9fe944ee02f7 参考书籍:《第一行代码》 背景(摘自《第一行代码》): 和许多其他的GUI库一样,Android的UI也是线程不安全的。也就是说,如果想要更新应用程序里的UI元素,则必须在主线程中进行,否则就会出现异常。 一、Handler机制的...

Peter__Li的博客 466

使Handler内部类导致内存泄露的解决方法

之前用AndroidStudio自带的代码分析出现的警告,说的是Handler导致内存泄露 Handler reference leaks the Handler should be static or leaks might occur (null) 出现这个提示的原因是有个Handler是内部类,并且是运行在主线程中的,我就是在Activity里有个内部类的Handler 因为调用H

0-0Xuan的专栏 566

android.os.handler包,GitHub - deyunvip/android-weak-handler: Memory safer implementation of android.o...

Android Weak HandlerMemory safer implementation of android.os.HandlerProblemOriginal implementation of Handler always keeps hard reference to handler in queue of execution.Any object in Message or Run...

weixin_39554891的博客 421

Android App 内存泄漏Handler

Android App 内存泄露之Handler Handler也是造成内存泄露的一个重要的源头,主要Handler属于TLS(Thread Local Storage)变量,生命周期和Activity是不一致的 ,Handler引用Activity会存在内存泄露。 看一下例如以下代码 /** * * 实现的主要功能。 * @version 1.0.0 * @a...

weixin_33767813的博客 80

推荐文章:Android开发者必备利器 —— 弱引用Handler库

在安卓开发领域,内存管理一直是开发者们难以回避的痛点。尤其是在处理异步任务时,`android.os.Handler`的不当使用往往会导致令人头疼的内存泄漏问题。但是,今天,我们带来了一款开源神器——**Android Weak Handler**,它为这个问题提供了优雅的解决方案。 ## 项目介绍 Android Weak Handler是一个轻量级且安全的Handler实现,旨在解决传统H...

gitblog_00226的博客 811

android-weak-handler原理解析:弱引用如何拯救你的应用内存

android-weak-handler是一个内存更安全的Android Handler实现,它通过弱引用机制解决了传统Handler可能导致的内存泄漏问题。当你在Android应用中使用Handler处理延迟任务或消息时,android-weak-handler能帮助你更有效地管理内存,避免因长期持有对象引用而造成的内存浪费。 ## 为什么传统Handler会导致内存泄漏? 传统的Andro

gitblog_00263的博客 962
上一篇: Android布局中添加条横线
下一篇: Android动画插入器
wenju_song
博客等级 码龄13年 14粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值