Android Handler的优化使用

Android Handler机制解析与性能优化实践 在Android开发中,线程通信是保证应用流畅运行的关键技术。Handler机制作为Android系统的核心通信框架,通过MessageQueue的消息队列和Looper的循环处理,实现了线程间的安全通信。其技术价值在于高效的任务调度与线程安全控制,广泛应用于UI更新、异步任务处理等场景。通过消息池机制和批处理优化,可以显著提升性能减少GC压力。本文结合内存泄漏防护和同步屏障等高级特性,深入探讨Handler在Android性能优化中的实践应用,帮助开发者构建更稳定的应用架构。 阅读详情

看到一遍写的不错的文字,引用一下!

Handler:

普通用法:

Handler用于处理和从队列MessageQueue中得到Message。一般我们要重写Handler的handleMessage(Message msg){}方法来处理,如下代码:

public class MainActivity extends Activity {
    private TextView textView;
    
	Handler normalHandler = new Handler(){
		@Override
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case 1:
				Log.i("test",textView.getText().toString());
				break;

			default:
				break;
			}
		};
	};
}



问题:

这个时候Handler会被Android SDK中Lint工具检查警告你(左边那个黄色灯泡+叹号):This Handler class should be static or leaks might occur 。

原因:

This Handler class should be static:

(知识点一)为什么静态内部类可以解决这个问题呢?或者说静态内部类和非静态内部类的区别是什么?

举例:class A{int a; static int b class B{}  static class C{} }  (A是外部类,B非静态内部类,C静态内部类,a普通字段,b静态字段)

1)B非静态内部类:

可以访问A.a和A.b,也就是外部的属性都能方位。因为B隐式的持有A类对象的引用,相当于A的属性

2)C静态内部类:

C只可以访问A.b,不可以方位A.a。为什么?因为C不含有A的引用,它和A类是同一个级别,只不过写到了A类的内部。

本例原因:

Handler匿名内部类,隐式的持有了外部类Activity的引用(这就是为什么你能在handleMessage()中调用MainActivity中TextView等的属性)。--->而以后调

Message message = normalHandler.obtainMessage();
normalHandler.sendMessageAtTime(message , 100*1000);

得到的message中又含有这个Handler的引用(可以看源码)。

在100秒后message被执行,这期间message被放在MessageQueue中,MessageQueue在Looper中,Looper是线程的本地变量。

也就是说MainActivity即使生命周期走完了也不会垃圾回收,为什么?因为Java的垃圾回收机制,就是看一个对象有没有被引用(从线程中的主要对象开始,对象之间的引用形成网状结构,如果有类的对象不在这张网上,就证明它没被引用。这就是数据结构中图的遍历,什么连通子图,非连通子图)。而本文中一个MainActivity被Handler持有引用,Handler被Message持有引用,Message被MessageQueue持有引用,MessageQueue被Looper持有引用,Looper为线程本地变量,线程不被摧毁,它就不会被销毁。

所以即便用户已经切换、退出到别的Activity,MainActivity占有的内存仍旧不会被释放。


解决方案:

打破引用链:

1.Message在100秒后被处理,之后回收Message,然后回收MainActivity。(所以是实际上,你只要不发很长时间的Message也不会有什么问题)

2.使Handler不持有MainActivity的引用,用弱引用WeakReference:(简单讲,就是只有WeakReference引用的对象,垃圾回收将回收该对象,以后再另写一篇引用的文章吧)


正常代码:

	MyHandler handler = new MyHandler(this);

	public static class MyHandler extends Handler {
		private WeakReference<MainActivity> reference;

		public MyHandler(MainActivity activity) {
			reference = new WeakReference<MainActivity>(activity);
		}

		@Override
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case 1:
				Log.i("test",textView.getText().toString());
				break;

			default:
				break;
			}
		}
	}




为何Android界面更新,Handler作为匿名内部类来实现handlerMessage方法

最重要的不是线程安全问题,而是android组件的监听方法中只能访问final 的属性,所以是无法修改的,只能把它交给handler处理。就是这个样子
 

ANDROID中handler的问题

Handler不等于使用线程。
传统的UI架构,如swing。将绘制展示、事件派发都放在主线程(UI)线程中进行。
UI线程的实现模型通常是一个死循环,不断接受Message。组织派发
android中Handler-MessageQueue-Looper,三者构成了这种死循环+消息通信的模型。此处的postDelayed实际上是将一个Runnable任务投入了MessageQueue中,并期望在3000毫秒后执行。
另外不要误以为Runnable是线程。在java.util.concurrent中,Dogn大神已经明确将执行过程与任务分割出来。Runnable接口只是表示一项任务,既可以同步执行,也可以在新线程中执行。
为何需要Handler而不用Thread。除了消息模型是UI框架的经典模式外,还涉及到UI组件不允许跨线程访问的限制。无论是.NET也好,swing也好,android也好,不允许在非UI线程中操作这一点都一样。
Handler便是android框架中异步线程代码到达同步线程的官方通道。从另一个角度说,这种基于消息模型的通信模式有时也很有用。相关的例子有IntentService,HandlerThread等。

Android Handler机制详解:原理、使用与优化 线程间通信是移动开发的核心技术之一,Android系统通过Handler机制实现跨线程消息传递。其底层基于消息队列(MessageQueue)和循环器(Looper)实现,能够有效解决UI线程与工作线程的通信问题。Handler不仅支持即时消息处理,还能实现延迟任务和周期性操作,在性能优化方面支持消息优先级控制。典型应用场景包括网络请求回调、耗时任务进度更新等。现代Android开发中虽然出现了协程、RxJava等替代方案,但理解Handler的Message、Looper等核心组件仍对处理内存泄漏、实现高 阅读详情

相关推荐

Android 优化Handler防止内存泄露

Android 优化Handler防止内存泄露 Demo描述:   Handler可能导致的内存泄露及其优化       1 关于常见的Handler的用法但是可能导致内存泄露    2 优化方式请参考BetterHandler和BetterRunnable的实现 package cc.cc; import java.lang.ref.WeakReference; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.app.Activity; /**

优化 Android Handler提升性能与稳定性

Handler是一个常见的组件,它在 Android 应用程序开发中被广泛使用。Handler可以将消息传递给主线程,使开发者能够在子线程中进行长时间的耗时操作,同时也避免了因在主线程中更新 UI 而出现的卡顿和 ANR 问题。

yihanss的博客 669

手把手教你用STM32H743+FreeRTOS+LWIP搭建物联网网关(附完整工程)

本文详细介绍了如何使用STM32H743微控制器结合FreeRTOS实时操作系统和LWIP协议栈构建高性能物联网网关。内容涵盖硬件配置、FreeRTOS任务设计、LWIP协议栈优化及物联网协议集成,提供完整工程示例,助力开发者快速实现稳定可靠的网络通信枢纽。

weixin_42623010的博客 503

android性能优化-Handler

一.概述     很多APP都要做性能优化,但是做性能优化首先得要发现问题,本本篇文章将教会你怎么发现android卡顿的地方。   二.如何发现卡顿点     卡顿一般都是线程处理消息卡顿,那我们就看看如何发现某一个消息卡顿吧,看这里前建议先了解一下Handler的原理,我就不再介绍了。 我们每一个线程都会有一个loop,这个负责循环处理消息,我们直接上代码吧: /** * Run...

aa787282301的博客 651

高速窄脉冲峰值保持设计

一、目的 在激光探测领域,探测器发出的高速窄脉冲,单片机AD进行采样,很难捕捉到窄脉冲的幅值,即使使用高速AD进行采样,也存在一定的难度。因此,本方案设计了一种高速窄脉冲峰值保持电路,有助于单片机AD采样能很好的捕捉到脉冲幅值。 二、方案分析与比较 峰值保持器一般分为两种:电压型和跨导型。 方案一:电压型峰值保持器,由电压型运放、二极管、保持电容、缓冲器组成,优点是元件成本低,缺点是峰值保持存在过...

weixin_43184208的博客 9295

基于matlab的车牌识别(含子程序)

基于matlab的车牌识别系统一、对车辆图像进行预处理1.载入车牌图像:function [d]=main(jpg) [filename, pathname] = uigetfile({'*.jpg', 'JPEG 文件(*.jpg)'}); if(filename == 0), return, end global FILENAME %定义全局变量 FILENAME = [pathname f...

TuTu998的博客 4万+

Android Handler之使用小结

在android开发中,使用Handler处理各种消息机制。 Handler用于处理和从队列MessageQueue中得到Message。一般我们要重写Handler的handleMessage(Message msg){}方法来处理,如下代码: 使用内部类的方式实现,官方是不建议这样写的。 public class MainActivity extends Activity { ...

weixin_34092455的博客 170

Python 映射函数map()详解

Python 映射函数map()详解

分享我的点点滴滴,在成长路上与你同行! 2141

Android 性能优化(二)Handler运行机制原理,源码分析

所以,我们需要,能在子线程中做完耗时操作,然后去到主线程更新UI的办法。是 Handler 机制提供的一种,可以在 Looper 事件循环的过程中,当消息队列为空或延迟消息还未执行的时候,执行任务的一种机制。Message内部构建一个链表维护被回收的Message对象,当调用obtain方法时会优先从池中获取,如果池中没有则创建新的Message对象,同时在使用完毕之后,进入池中以便于复用。如果没有消息就一直阻塞。在Looper.loop()方法,使用完毕时候调用了Message的recycle()方法。

csdn_aiyang的博客 2018

别再让会议变‘回音壁’:手把手教你调优WebRTC的AEC3回声消除(附实战代码)

本文深入解析WebRTC的AEC3回声消除技术,提供从参数调优到声学环境适配的实战指南。通过诊断回声特征、解剖核心参数(如filter.length_blocks和delay_estimate_smoothing)以及应对特殊场景(如密闭空间与开放办公区),帮助开发者有效解决视频会议中的回声问题,提升语音通信质量。附有实战代码和调试工具,适合需要优化实时通信体验的开发者。

weixin_29220405的博客 173

099、多摄融合与变焦系统:广角到长焦的无缝切换算法

本文分享了多摄融合与变焦系统开发中的实战经验和关键挑战。作者通过一个旗舰机项目案例,揭示了广角到长焦切换时画面抖动问题的根源——融合算法误将视差当作运动补偿,并提出"视差冻结窗口"的解决方案。文章总结了三大多摄融合难点:物理视差处理、亮度差异补偿和切换时机把控,详细阐述了分层架构设计、融合权重计算等核心技术。同时强调了产线校准的重要性,并给出五项实用建议:允许边缘鬼影保留、参数场景化配置、加强产线检测、完善调试接口,以及合理运用AI技术。全文展现了多摄融合技术在时间、空间和感知维度上的复杂平衡艺术。

sundong_81的博客 48

android handler优化,Android 优化Handler防止内存泄露

Android 优化Handler防止内存泄露Demo描述:Handler可能导致的内存泄露及其优化1 关于常见的Handler的用法但是可能导致内存泄露2 优化方式请参考BetterHandler和BetterRunnable的实现package cc.cc;import java.lang.ref.WeakReference;import android.os.Bundle;import an...

weixin_42412250的博客 193

机器视觉框架源码——解读5(Dock和开源UI)

本文介绍了工业软件中Dock工具面板的使用方法,主要包括三个部分:添加avalonDock引用、修改属性配置(如显示样式和背景色),以及通过MVVM命令实现布局的加载和保存。加载布局通过XmlLayoutSerializer从XML文件恢复界面状态,保存布局则将当前DockManager的布局序列化为XML文件。文章提供了代码示例和截图说明,帮助开发者快速掌握Dock面板的核心功能。

Z's Palace 403

【Android】Handler,安卓内存优化管理器

============================================================================= 1. Looper和消息队列机制 Handler持有了一个消息队列MessageQueue对象mQueue。这个对象是Handler实例构造的时候,通过Looper传递过来的。当使用无参构造方法时,这个Looper为Looper.myLooper()。 public Handler() { // 。。。 mLooper = Looper.myLoope

wq221aas的博客 528

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Devexpress16.2.6破解工具

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

android 中Handler 对内存造成溢出和泄露的优化方案 使用 Weak Handler Memory safer implementation of android.os.Handler

github 地址 学习地址 https://github.com/badoo/android-weak-handler 注:如何对内存要求优化非常高的app 可以干掉系统的handler 用Weak Handler 处理 dependencies { compile 'com.badoo.mobile:android-weak-handler:1.1' } import

qq_30519365的博客 1400

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Android 优化笔记,Handler

Android 也已经学习了一段时间了,一路走来,开始看着这东西好像不难,啥都不懂,只要一个方法一个方法的调就是了;又学了一段时间,不满足于啥都不懂,而是默默的去看为啥这个方法可以达到我要的目的?怎么实现的?这个实现的方法中有哪些是我需要学习的?根据这些我可以在那些地方做一些改变,优化?这样走下来,我是一脸的懵逼…… 在我懵逼的过程中感谢网络上的各位前辈的无私奉献,详尽的解析。也萌生了我开始做笔

qq_34815072的博客 316

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Android Handler机制:原理、优化与实战

在Android开发中,线程间通信是核心需求之一,Handler机制作为实现这一需求的关键技术,通过消息队列和循环机制实现了线程切换、延时任务等功能。其工作原理基于四个核心组件:Handler、Message、MessageQueue和Looper,协同完成消息的发送、存储、分发和处理。这一机制不仅解决了Android主线程与子线程间的通信问题,还广泛应用于UI更新、定时任务等场景。在实际开发中,合理使用Handler能显著提升应用性能,但需注意内存泄漏和消息堆积等常见问题。通过消息池优化和批量处理等技巧,

weixin_33692284的博客 428

浅谈Android布局XML文件优化与Handler的使用优化

写在前面 笔者从毕业之后,就一直从事android开发的相关工作。到目前为止,已有两年有余。不知从什么时候开始,上班的早晨每天都会发大约个把小时浏览相关技术文章。俗话说:熟读唐诗三百会作诗也会吟。是时候也该自己写技术文章了。一来,记录自己在android路上的点滴与成长;二来,为android知识开源贡献一份自己的绵薄之力。废话不多说了,接下来就进入正文阶段。 复制代码 正文阶段 androi...

weixin_33950035的博客 110

安卓View+Handler+Binder,Android性能优化常见问题

Android学习是一条漫长的道路,我们要学习的东西不仅仅只有表面的 技术,还要深入底层,弄明白下面的 原理,只有这样,我们才能够提高自己的竞争力,在当今这个竞争激烈的世界里立足。人生不可能一帆风顺,有高峰自然有低谷,要相信,那些打不倒我们的,终将使我们更强大,要做自己的摆渡人。我把自己这段时间整理的Android最重要最热门的学习方向资料放在了我的GitHub,里面还有不同方向的自学编程路线、面试题集合/面经、及系列技术文章等。我把自己这段时间整理的Android最重要最热门的学习方向资料放在了。

m0_60635321的博客 793

Android 优化之handler弱引用

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

weixin_44021334的博客 3470

Android handler 优化

handler泄漏2个方面: 1、Message 泄漏, handler_verify.removeCallbacksAndMessages(null);(解决) 2、java中的内部类持有外部类的引用; 弱引用解决 private static class VerifyHandler extends Handler{ private WeakReference<?extends Activity> reference; public Ve...

简公子的博客 475

安卓性能优化之清除Handler的Message和Runnable

原文:https://blog.youkuaiyun.com/stzy00/article/details/43988213Handler是由系统所提供的一种异步消息处理的常用方式,一般情况下不会发生内存泄露.但既然是调优,当在A_Activity中使用handler发送了几个消息,然后又跳到B_Activity,这个时候如果我们想结束之前在A_Activity中发出的消息,不再占用多余的队列空间.怎么办呢?...

BoriseLee 2625
下一篇: FragmentPagerAdapter刷新
plx_csdn
博客等级 码龄10年 10粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值